LCOV - code coverage report
Current view: top level - net/mac80211 - ieee80211_i.h (source / functions) Hit Total Coverage
Test: combined.info Lines: 2 95 2.1 %
Date: 2022-03-28 16:04:14 Functions: 0 4 0.0 %
Branches: 1 263 0.4 %

           Branch data     Line data    Source code
       1                 :            : /* SPDX-License-Identifier: GPL-2.0-only */
       2                 :            : /*
       3                 :            :  * Copyright 2002-2005, Instant802 Networks, Inc.
       4                 :            :  * Copyright 2005, Devicescape Software, Inc.
       5                 :            :  * Copyright 2006-2007  Jiri Benc <jbenc@suse.cz>
       6                 :            :  * Copyright 2007-2010  Johannes Berg <johannes@sipsolutions.net>
       7                 :            :  * Copyright 2013-2015  Intel Mobile Communications GmbH
       8                 :            :  * Copyright (C) 2018-2019 Intel Corporation
       9                 :            :  */
      10                 :            : 
      11                 :            : #ifndef IEEE80211_I_H
      12                 :            : #define IEEE80211_I_H
      13                 :            : 
      14                 :            : #include <linux/kernel.h>
      15                 :            : #include <linux/device.h>
      16                 :            : #include <linux/if_ether.h>
      17                 :            : #include <linux/interrupt.h>
      18                 :            : #include <linux/list.h>
      19                 :            : #include <linux/netdevice.h>
      20                 :            : #include <linux/skbuff.h>
      21                 :            : #include <linux/workqueue.h>
      22                 :            : #include <linux/types.h>
      23                 :            : #include <linux/spinlock.h>
      24                 :            : #include <linux/etherdevice.h>
      25                 :            : #include <linux/leds.h>
      26                 :            : #include <linux/idr.h>
      27                 :            : #include <linux/rhashtable.h>
      28                 :            : #include <net/ieee80211_radiotap.h>
      29                 :            : #include <net/cfg80211.h>
      30                 :            : #include <net/mac80211.h>
      31                 :            : #include <net/fq.h>
      32                 :            : #include "key.h"
      33                 :            : #include "sta_info.h"
      34                 :            : #include "debug.h"
      35                 :            : 
      36                 :            : extern const struct cfg80211_ops mac80211_config_ops;
      37                 :            : 
      38                 :            : struct ieee80211_local;
      39                 :            : 
      40                 :            : /* Maximum number of broadcast/multicast frames to buffer when some of the
      41                 :            :  * associated stations are using power saving. */
      42                 :            : #define AP_MAX_BC_BUFFER 128
      43                 :            : 
      44                 :            : /* Maximum number of frames buffered to all STAs, including multicast frames.
      45                 :            :  * Note: increasing this limit increases the potential memory requirement. Each
      46                 :            :  * frame can be up to about 2 kB long. */
      47                 :            : #define TOTAL_MAX_TX_BUFFER 512
      48                 :            : 
      49                 :            : /* Required encryption head and tailroom */
      50                 :            : #define IEEE80211_ENCRYPT_HEADROOM 8
      51                 :            : #define IEEE80211_ENCRYPT_TAILROOM 18
      52                 :            : 
      53                 :            : /* IEEE 802.11 (Ch. 9.5 Defragmentation) requires support for concurrent
      54                 :            :  * reception of at least three fragmented frames. This limit can be increased
      55                 :            :  * by changing this define, at the cost of slower frame reassembly and
      56                 :            :  * increased memory use (about 2 kB of RAM per entry). */
      57                 :            : #define IEEE80211_FRAGMENT_MAX 4
      58                 :            : 
      59                 :            : /* power level hasn't been configured (or set to automatic) */
      60                 :            : #define IEEE80211_UNSET_POWER_LEVEL     INT_MIN
      61                 :            : 
      62                 :            : /*
      63                 :            :  * Some APs experience problems when working with U-APSD. Decreasing the
      64                 :            :  * probability of that happening by using legacy mode for all ACs but VO isn't
      65                 :            :  * enough.
      66                 :            :  *
      67                 :            :  * Cisco 4410N originally forced us to enable VO by default only because it
      68                 :            :  * treated non-VO ACs as legacy.
      69                 :            :  *
      70                 :            :  * However some APs (notably Netgear R7000) silently reclassify packets to
      71                 :            :  * different ACs. Since u-APSD ACs require trigger frames for frame retrieval
      72                 :            :  * clients would never see some frames (e.g. ARP responses) or would fetch them
      73                 :            :  * accidentally after a long time.
      74                 :            :  *
      75                 :            :  * It makes little sense to enable u-APSD queues by default because it needs
      76                 :            :  * userspace applications to be aware of it to actually take advantage of the
      77                 :            :  * possible additional powersavings. Implicitly depending on driver autotrigger
      78                 :            :  * frame support doesn't make much sense.
      79                 :            :  */
      80                 :            : #define IEEE80211_DEFAULT_UAPSD_QUEUES 0
      81                 :            : 
      82                 :            : #define IEEE80211_DEFAULT_MAX_SP_LEN            \
      83                 :            :         IEEE80211_WMM_IE_STA_QOSINFO_SP_ALL
      84                 :            : 
      85                 :            : extern const u8 ieee80211_ac_to_qos_mask[IEEE80211_NUM_ACS];
      86                 :            : 
      87                 :            : #define IEEE80211_DEAUTH_FRAME_LEN      (24 /* hdr */ + 2 /* reason */)
      88                 :            : 
      89                 :            : #define IEEE80211_MAX_NAN_INSTANCE_ID 255
      90                 :            : 
      91                 :            : struct ieee80211_fragment_entry {
      92                 :            :         struct sk_buff_head skb_list;
      93                 :            :         unsigned long first_frag_time;
      94                 :            :         u16 seq;
      95                 :            :         u16 extra_len;
      96                 :            :         u16 last_frag;
      97                 :            :         u8 rx_queue;
      98                 :            :         bool check_sequential_pn; /* needed for CCMP/GCMP */
      99                 :            :         u8 last_pn[6]; /* PN of the last fragment if CCMP was used */
     100                 :            : };
     101                 :            : 
     102                 :            : 
     103                 :            : struct ieee80211_bss {
     104                 :            :         u32 device_ts_beacon, device_ts_presp;
     105                 :            : 
     106                 :            :         bool wmm_used;
     107                 :            :         bool uapsd_supported;
     108                 :            : 
     109                 :            : #define IEEE80211_MAX_SUPP_RATES 32
     110                 :            :         u8 supp_rates[IEEE80211_MAX_SUPP_RATES];
     111                 :            :         size_t supp_rates_len;
     112                 :            :         struct ieee80211_rate *beacon_rate;
     113                 :            : 
     114                 :            :         /*
     115                 :            :          * During association, we save an ERP value from a probe response so
     116                 :            :          * that we can feed ERP info to the driver when handling the
     117                 :            :          * association completes. these fields probably won't be up-to-date
     118                 :            :          * otherwise, you probably don't want to use them.
     119                 :            :          */
     120                 :            :         bool has_erp_value;
     121                 :            :         u8 erp_value;
     122                 :            : 
     123                 :            :         /* Keep track of the corruption of the last beacon/probe response. */
     124                 :            :         u8 corrupt_data;
     125                 :            : 
     126                 :            :         /* Keep track of what bits of information we have valid info for. */
     127                 :            :         u8 valid_data;
     128                 :            : };
     129                 :            : 
     130                 :            : /**
     131                 :            :  * enum ieee80211_corrupt_data_flags - BSS data corruption flags
     132                 :            :  * @IEEE80211_BSS_CORRUPT_BEACON: last beacon frame received was corrupted
     133                 :            :  * @IEEE80211_BSS_CORRUPT_PROBE_RESP: last probe response received was corrupted
     134                 :            :  *
     135                 :            :  * These are bss flags that are attached to a bss in the
     136                 :            :  * @corrupt_data field of &struct ieee80211_bss.
     137                 :            :  */
     138                 :            : enum ieee80211_bss_corrupt_data_flags {
     139                 :            :         IEEE80211_BSS_CORRUPT_BEACON            = BIT(0),
     140                 :            :         IEEE80211_BSS_CORRUPT_PROBE_RESP        = BIT(1)
     141                 :            : };
     142                 :            : 
     143                 :            : /**
     144                 :            :  * enum ieee80211_valid_data_flags - BSS valid data flags
     145                 :            :  * @IEEE80211_BSS_VALID_WMM: WMM/UAPSD data was gathered from non-corrupt IE
     146                 :            :  * @IEEE80211_BSS_VALID_RATES: Supported rates were gathered from non-corrupt IE
     147                 :            :  * @IEEE80211_BSS_VALID_ERP: ERP flag was gathered from non-corrupt IE
     148                 :            :  *
     149                 :            :  * These are bss flags that are attached to a bss in the
     150                 :            :  * @valid_data field of &struct ieee80211_bss.  They show which parts
     151                 :            :  * of the data structure were received as a result of an un-corrupted
     152                 :            :  * beacon/probe response.
     153                 :            :  */
     154                 :            : enum ieee80211_bss_valid_data_flags {
     155                 :            :         IEEE80211_BSS_VALID_WMM                 = BIT(1),
     156                 :            :         IEEE80211_BSS_VALID_RATES               = BIT(2),
     157                 :            :         IEEE80211_BSS_VALID_ERP                 = BIT(3)
     158                 :            : };
     159                 :            : 
     160                 :            : typedef unsigned __bitwise ieee80211_tx_result;
     161                 :            : #define TX_CONTINUE     ((__force ieee80211_tx_result) 0u)
     162                 :            : #define TX_DROP         ((__force ieee80211_tx_result) 1u)
     163                 :            : #define TX_QUEUED       ((__force ieee80211_tx_result) 2u)
     164                 :            : 
     165                 :            : #define IEEE80211_TX_NO_SEQNO           BIT(0)
     166                 :            : #define IEEE80211_TX_UNICAST            BIT(1)
     167                 :            : #define IEEE80211_TX_PS_BUFFERED        BIT(2)
     168                 :            : 
     169                 :            : struct ieee80211_tx_data {
     170                 :            :         struct sk_buff *skb;
     171                 :            :         struct sk_buff_head skbs;
     172                 :            :         struct ieee80211_local *local;
     173                 :            :         struct ieee80211_sub_if_data *sdata;
     174                 :            :         struct sta_info *sta;
     175                 :            :         struct ieee80211_key *key;
     176                 :            :         struct ieee80211_tx_rate rate;
     177                 :            : 
     178                 :            :         unsigned int flags;
     179                 :            : };
     180                 :            : 
     181                 :            : 
     182                 :            : typedef unsigned __bitwise ieee80211_rx_result;
     183                 :            : #define RX_CONTINUE             ((__force ieee80211_rx_result) 0u)
     184                 :            : #define RX_DROP_UNUSABLE        ((__force ieee80211_rx_result) 1u)
     185                 :            : #define RX_DROP_MONITOR         ((__force ieee80211_rx_result) 2u)
     186                 :            : #define RX_QUEUED               ((__force ieee80211_rx_result) 3u)
     187                 :            : 
     188                 :            : /**
     189                 :            :  * enum ieee80211_packet_rx_flags - packet RX flags
     190                 :            :  * @IEEE80211_RX_AMSDU: a-MSDU packet
     191                 :            :  * @IEEE80211_RX_MALFORMED_ACTION_FRM: action frame is malformed
     192                 :            :  * @IEEE80211_RX_DEFERRED_RELEASE: frame was subjected to receive reordering
     193                 :            :  *
     194                 :            :  * These are per-frame flags that are attached to a frame in the
     195                 :            :  * @rx_flags field of &struct ieee80211_rx_status.
     196                 :            :  */
     197                 :            : enum ieee80211_packet_rx_flags {
     198                 :            :         IEEE80211_RX_AMSDU                      = BIT(3),
     199                 :            :         IEEE80211_RX_MALFORMED_ACTION_FRM       = BIT(4),
     200                 :            :         IEEE80211_RX_DEFERRED_RELEASE           = BIT(5),
     201                 :            : };
     202                 :            : 
     203                 :            : /**
     204                 :            :  * enum ieee80211_rx_flags - RX data flags
     205                 :            :  *
     206                 :            :  * @IEEE80211_RX_CMNTR: received on cooked monitor already
     207                 :            :  * @IEEE80211_RX_BEACON_REPORTED: This frame was already reported
     208                 :            :  *      to cfg80211_report_obss_beacon().
     209                 :            :  *
     210                 :            :  * These flags are used across handling multiple interfaces
     211                 :            :  * for a single frame.
     212                 :            :  */
     213                 :            : enum ieee80211_rx_flags {
     214                 :            :         IEEE80211_RX_CMNTR              = BIT(0),
     215                 :            :         IEEE80211_RX_BEACON_REPORTED    = BIT(1),
     216                 :            : };
     217                 :            : 
     218                 :            : struct ieee80211_rx_data {
     219                 :            :         struct napi_struct *napi;
     220                 :            :         struct sk_buff *skb;
     221                 :            :         struct ieee80211_local *local;
     222                 :            :         struct ieee80211_sub_if_data *sdata;
     223                 :            :         struct sta_info *sta;
     224                 :            :         struct ieee80211_key *key;
     225                 :            : 
     226                 :            :         unsigned int flags;
     227                 :            : 
     228                 :            :         /*
     229                 :            :          * Index into sequence numbers array, 0..16
     230                 :            :          * since the last (16) is used for non-QoS,
     231                 :            :          * will be 16 on non-QoS frames.
     232                 :            :          */
     233                 :            :         int seqno_idx;
     234                 :            : 
     235                 :            :         /*
     236                 :            :          * Index into the security IV/PN arrays, 0..16
     237                 :            :          * since the last (16) is used for CCMP-encrypted
     238                 :            :          * management frames, will be set to 16 on mgmt
     239                 :            :          * frames and 0 on non-QoS frames.
     240                 :            :          */
     241                 :            :         int security_idx;
     242                 :            : 
     243                 :            :         u32 tkip_iv32;
     244                 :            :         u16 tkip_iv16;
     245                 :            : };
     246                 :            : 
     247                 :            : struct ieee80211_csa_settings {
     248                 :            :         const u16 *counter_offsets_beacon;
     249                 :            :         const u16 *counter_offsets_presp;
     250                 :            : 
     251                 :            :         int n_counter_offsets_beacon;
     252                 :            :         int n_counter_offsets_presp;
     253                 :            : 
     254                 :            :         u8 count;
     255                 :            : };
     256                 :            : 
     257                 :            : struct beacon_data {
     258                 :            :         u8 *head, *tail;
     259                 :            :         int head_len, tail_len;
     260                 :            :         struct ieee80211_meshconf_ie *meshconf;
     261                 :            :         u16 csa_counter_offsets[IEEE80211_MAX_CSA_COUNTERS_NUM];
     262                 :            :         u8 csa_current_counter;
     263                 :            :         struct rcu_head rcu_head;
     264                 :            : };
     265                 :            : 
     266                 :            : struct probe_resp {
     267                 :            :         struct rcu_head rcu_head;
     268                 :            :         int len;
     269                 :            :         u16 csa_counter_offsets[IEEE80211_MAX_CSA_COUNTERS_NUM];
     270                 :            :         u8 data[0];
     271                 :            : };
     272                 :            : 
     273                 :            : struct ps_data {
     274                 :            :         /* yes, this looks ugly, but guarantees that we can later use
     275                 :            :          * bitmap_empty :)
     276                 :            :          * NB: don't touch this bitmap, use sta_info_{set,clear}_tim_bit */
     277                 :            :         u8 tim[sizeof(unsigned long) * BITS_TO_LONGS(IEEE80211_MAX_AID + 1)]
     278                 :            :                         __aligned(__alignof__(unsigned long));
     279                 :            :         struct sk_buff_head bc_buf;
     280                 :            :         atomic_t num_sta_ps; /* number of stations in PS mode */
     281                 :            :         int dtim_count;
     282                 :            :         bool dtim_bc_mc;
     283                 :            : };
     284                 :            : 
     285                 :            : struct ieee80211_if_ap {
     286                 :            :         struct beacon_data __rcu *beacon;
     287                 :            :         struct probe_resp __rcu *probe_resp;
     288                 :            : 
     289                 :            :         /* to be used after channel switch. */
     290                 :            :         struct cfg80211_beacon_data *next_beacon;
     291                 :            :         struct list_head vlans; /* write-protected with RTNL and local->mtx */
     292                 :            : 
     293                 :            :         struct ps_data ps;
     294                 :            :         atomic_t num_mcast_sta; /* number of stations receiving multicast */
     295                 :            :         enum ieee80211_smps_mode req_smps, /* requested smps mode */
     296                 :            :                          driver_smps_mode; /* smps mode request */
     297                 :            : 
     298                 :            :         struct work_struct request_smps_work;
     299                 :            :         bool multicast_to_unicast;
     300                 :            : };
     301                 :            : 
     302                 :            : struct ieee80211_if_wds {
     303                 :            :         struct sta_info *sta;
     304                 :            :         u8 remote_addr[ETH_ALEN];
     305                 :            : };
     306                 :            : 
     307                 :            : struct ieee80211_if_vlan {
     308                 :            :         struct list_head list; /* write-protected with RTNL and local->mtx */
     309                 :            : 
     310                 :            :         /* used for all tx if the VLAN is configured to 4-addr mode */
     311                 :            :         struct sta_info __rcu *sta;
     312                 :            :         atomic_t num_mcast_sta; /* number of stations receiving multicast */
     313                 :            : };
     314                 :            : 
     315                 :            : struct mesh_stats {
     316                 :            :         __u32 fwded_mcast;              /* Mesh forwarded multicast frames */
     317                 :            :         __u32 fwded_unicast;            /* Mesh forwarded unicast frames */
     318                 :            :         __u32 fwded_frames;             /* Mesh total forwarded frames */
     319                 :            :         __u32 dropped_frames_ttl;       /* Not transmitted since mesh_ttl == 0*/
     320                 :            :         __u32 dropped_frames_no_route;  /* Not transmitted, no route found */
     321                 :            :         __u32 dropped_frames_congestion;/* Not forwarded due to congestion */
     322                 :            : };
     323                 :            : 
     324                 :            : #define PREQ_Q_F_START          0x1
     325                 :            : #define PREQ_Q_F_REFRESH        0x2
     326                 :            : struct mesh_preq_queue {
     327                 :            :         struct list_head list;
     328                 :            :         u8 dst[ETH_ALEN];
     329                 :            :         u8 flags;
     330                 :            : };
     331                 :            : 
     332                 :            : struct ieee80211_roc_work {
     333                 :            :         struct list_head list;
     334                 :            : 
     335                 :            :         struct ieee80211_sub_if_data *sdata;
     336                 :            : 
     337                 :            :         struct ieee80211_channel *chan;
     338                 :            : 
     339                 :            :         bool started, abort, hw_begun, notified;
     340                 :            :         bool on_channel;
     341                 :            : 
     342                 :            :         unsigned long start_time;
     343                 :            : 
     344                 :            :         u32 duration, req_duration;
     345                 :            :         struct sk_buff *frame;
     346                 :            :         u64 cookie, mgmt_tx_cookie;
     347                 :            :         enum ieee80211_roc_type type;
     348                 :            : };
     349                 :            : 
     350                 :            : /* flags used in struct ieee80211_if_managed.flags */
     351                 :            : enum ieee80211_sta_flags {
     352                 :            :         IEEE80211_STA_CONNECTION_POLL   = BIT(1),
     353                 :            :         IEEE80211_STA_CONTROL_PORT      = BIT(2),
     354                 :            :         IEEE80211_STA_DISABLE_HT        = BIT(4),
     355                 :            :         IEEE80211_STA_MFP_ENABLED       = BIT(6),
     356                 :            :         IEEE80211_STA_UAPSD_ENABLED     = BIT(7),
     357                 :            :         IEEE80211_STA_NULLFUNC_ACKED    = BIT(8),
     358                 :            :         IEEE80211_STA_RESET_SIGNAL_AVE  = BIT(9),
     359                 :            :         IEEE80211_STA_DISABLE_40MHZ     = BIT(10),
     360                 :            :         IEEE80211_STA_DISABLE_VHT       = BIT(11),
     361                 :            :         IEEE80211_STA_DISABLE_80P80MHZ  = BIT(12),
     362                 :            :         IEEE80211_STA_DISABLE_160MHZ    = BIT(13),
     363                 :            :         IEEE80211_STA_DISABLE_WMM       = BIT(14),
     364                 :            :         IEEE80211_STA_ENABLE_RRM        = BIT(15),
     365                 :            :         IEEE80211_STA_DISABLE_HE        = BIT(16),
     366                 :            : };
     367                 :            : 
     368                 :            : struct ieee80211_mgd_auth_data {
     369                 :            :         struct cfg80211_bss *bss;
     370                 :            :         unsigned long timeout;
     371                 :            :         int tries;
     372                 :            :         u16 algorithm, expected_transaction;
     373                 :            : 
     374                 :            :         u8 key[WLAN_KEY_LEN_WEP104];
     375                 :            :         u8 key_len, key_idx;
     376                 :            :         bool done;
     377                 :            :         bool peer_confirmed;
     378                 :            :         bool timeout_started;
     379                 :            : 
     380                 :            :         u16 sae_trans, sae_status;
     381                 :            :         size_t data_len;
     382                 :            :         u8 data[];
     383                 :            : };
     384                 :            : 
     385                 :            : struct ieee80211_mgd_assoc_data {
     386                 :            :         struct cfg80211_bss *bss;
     387                 :            :         const u8 *supp_rates;
     388                 :            : 
     389                 :            :         unsigned long timeout;
     390                 :            :         int tries;
     391                 :            : 
     392                 :            :         u16 capability;
     393                 :            :         u8 prev_bssid[ETH_ALEN];
     394                 :            :         u8 ssid[IEEE80211_MAX_SSID_LEN];
     395                 :            :         u8 ssid_len;
     396                 :            :         u8 supp_rates_len;
     397                 :            :         bool wmm, uapsd;
     398                 :            :         bool need_beacon;
     399                 :            :         bool synced;
     400                 :            :         bool timeout_started;
     401                 :            : 
     402                 :            :         u8 ap_ht_param;
     403                 :            : 
     404                 :            :         struct ieee80211_vht_cap ap_vht_cap;
     405                 :            : 
     406                 :            :         u8 fils_nonces[2 * FILS_NONCE_LEN];
     407                 :            :         u8 fils_kek[FILS_MAX_KEK_LEN];
     408                 :            :         size_t fils_kek_len;
     409                 :            : 
     410                 :            :         size_t ie_len;
     411                 :            :         u8 ie[];
     412                 :            : };
     413                 :            : 
     414                 :            : struct ieee80211_sta_tx_tspec {
     415                 :            :         /* timestamp of the first packet in the time slice */
     416                 :            :         unsigned long time_slice_start;
     417                 :            : 
     418                 :            :         u32 admitted_time; /* in usecs, unlike over the air */
     419                 :            :         u8 tsid;
     420                 :            :         s8 up; /* signed to be able to invalidate with -1 during teardown */
     421                 :            : 
     422                 :            :         /* consumed TX time in microseconds in the time slice */
     423                 :            :         u32 consumed_tx_time;
     424                 :            :         enum {
     425                 :            :                 TX_TSPEC_ACTION_NONE = 0,
     426                 :            :                 TX_TSPEC_ACTION_DOWNGRADE,
     427                 :            :                 TX_TSPEC_ACTION_STOP_DOWNGRADE,
     428                 :            :         } action;
     429                 :            :         bool downgraded;
     430                 :            : };
     431                 :            : 
     432                 :          0 : DECLARE_EWMA(beacon_signal, 4, 4)
     433                 :            : 
     434                 :            : struct ieee80211_if_managed {
     435                 :            :         struct timer_list timer;
     436                 :            :         struct timer_list conn_mon_timer;
     437                 :            :         struct timer_list bcn_mon_timer;
     438                 :            :         struct timer_list chswitch_timer;
     439                 :            :         struct work_struct monitor_work;
     440                 :            :         struct work_struct chswitch_work;
     441                 :            :         struct work_struct beacon_connection_loss_work;
     442                 :            :         struct work_struct csa_connection_drop_work;
     443                 :            : 
     444                 :            :         unsigned long beacon_timeout;
     445                 :            :         unsigned long probe_timeout;
     446                 :            :         int probe_send_count;
     447                 :            :         bool nullfunc_failed;
     448                 :            :         bool connection_loss;
     449                 :            : 
     450                 :            :         struct cfg80211_bss *associated;
     451                 :            :         struct ieee80211_mgd_auth_data *auth_data;
     452                 :            :         struct ieee80211_mgd_assoc_data *assoc_data;
     453                 :            : 
     454                 :            :         u8 bssid[ETH_ALEN] __aligned(2);
     455                 :            : 
     456                 :            :         u16 aid;
     457                 :            : 
     458                 :            :         bool powersave; /* powersave requested for this iface */
     459                 :            :         bool broken_ap; /* AP is broken -- turn off powersave */
     460                 :            :         bool have_beacon;
     461                 :            :         u8 dtim_period;
     462                 :            :         enum ieee80211_smps_mode req_smps, /* requested smps mode */
     463                 :            :                                  driver_smps_mode; /* smps mode request */
     464                 :            : 
     465                 :            :         struct work_struct request_smps_work;
     466                 :            : 
     467                 :            :         unsigned int flags;
     468                 :            : 
     469                 :            :         bool csa_waiting_bcn;
     470                 :            :         bool csa_ignored_same_chan;
     471                 :            : 
     472                 :            :         bool beacon_crc_valid;
     473                 :            :         u32 beacon_crc;
     474                 :            : 
     475                 :            :         bool status_acked;
     476                 :            :         bool status_received;
     477                 :            :         __le16 status_fc;
     478                 :            : 
     479                 :            :         enum {
     480                 :            :                 IEEE80211_MFP_DISABLED,
     481                 :            :                 IEEE80211_MFP_OPTIONAL,
     482                 :            :                 IEEE80211_MFP_REQUIRED
     483                 :            :         } mfp; /* management frame protection */
     484                 :            : 
     485                 :            :         /*
     486                 :            :          * Bitmask of enabled u-apsd queues,
     487                 :            :          * IEEE80211_WMM_IE_STA_QOSINFO_AC_BE & co. Needs a new association
     488                 :            :          * to take effect.
     489                 :            :          */
     490                 :            :         unsigned int uapsd_queues;
     491                 :            : 
     492                 :            :         /*
     493                 :            :          * Maximum number of buffered frames AP can deliver during a
     494                 :            :          * service period, IEEE80211_WMM_IE_STA_QOSINFO_SP_ALL or similar.
     495                 :            :          * Needs a new association to take effect.
     496                 :            :          */
     497                 :            :         unsigned int uapsd_max_sp_len;
     498                 :            : 
     499                 :            :         int wmm_last_param_set;
     500                 :            :         int mu_edca_last_param_set;
     501                 :            : 
     502                 :            :         u8 use_4addr;
     503                 :            : 
     504                 :            :         s16 p2p_noa_index;
     505                 :            : 
     506                 :            :         struct ewma_beacon_signal ave_beacon_signal;
     507                 :            : 
     508                 :            :         /*
     509                 :            :          * Number of Beacon frames used in ave_beacon_signal. This can be used
     510                 :            :          * to avoid generating less reliable cqm events that would be based
     511                 :            :          * only on couple of received frames.
     512                 :            :          */
     513                 :            :         unsigned int count_beacon_signal;
     514                 :            : 
     515                 :            :         /* Number of times beacon loss was invoked. */
     516                 :            :         unsigned int beacon_loss_count;
     517                 :            : 
     518                 :            :         /*
     519                 :            :          * Last Beacon frame signal strength average (ave_beacon_signal / 16)
     520                 :            :          * that triggered a cqm event. 0 indicates that no event has been
     521                 :            :          * generated for the current association.
     522                 :            :          */
     523                 :            :         int last_cqm_event_signal;
     524                 :            : 
     525                 :            :         /*
     526                 :            :          * State variables for keeping track of RSSI of the AP currently
     527                 :            :          * connected to and informing driver when RSSI has gone
     528                 :            :          * below/above a certain threshold.
     529                 :            :          */
     530                 :            :         int rssi_min_thold, rssi_max_thold;
     531                 :            :         int last_ave_beacon_signal;
     532                 :            : 
     533                 :            :         struct ieee80211_ht_cap ht_capa; /* configured ht-cap over-rides */
     534                 :            :         struct ieee80211_ht_cap ht_capa_mask; /* Valid parts of ht_capa */
     535                 :            :         struct ieee80211_vht_cap vht_capa; /* configured VHT overrides */
     536                 :            :         struct ieee80211_vht_cap vht_capa_mask; /* Valid parts of vht_capa */
     537                 :            : 
     538                 :            :         /* TDLS support */
     539                 :            :         u8 tdls_peer[ETH_ALEN] __aligned(2);
     540                 :            :         struct delayed_work tdls_peer_del_work;
     541                 :            :         struct sk_buff *orig_teardown_skb; /* The original teardown skb */
     542                 :            :         struct sk_buff *teardown_skb; /* A copy to send through the AP */
     543                 :            :         spinlock_t teardown_lock; /* To lock changing teardown_skb */
     544                 :            :         bool tdls_chan_switch_prohibited;
     545                 :            :         bool tdls_wider_bw_prohibited;
     546                 :            : 
     547                 :            :         /* WMM-AC TSPEC support */
     548                 :            :         struct ieee80211_sta_tx_tspec tx_tspec[IEEE80211_NUM_ACS];
     549                 :            :         /* Use a separate work struct so that we can do something here
     550                 :            :          * while the sdata->work is flushing the queues, for example.
     551                 :            :          * otherwise, in scenarios where we hardly get any traffic out
     552                 :            :          * on the BE queue, but there's a lot of VO traffic, we might
     553                 :            :          * get stuck in a downgraded situation and flush takes forever.
     554                 :            :          */
     555                 :            :         struct delayed_work tx_tspec_wk;
     556                 :            : 
     557                 :            :         /* Information elements from the last transmitted (Re)Association
     558                 :            :          * Request frame.
     559                 :            :          */
     560                 :            :         u8 *assoc_req_ies;
     561                 :            :         size_t assoc_req_ies_len;
     562                 :            : };
     563                 :            : 
     564                 :            : struct ieee80211_if_ibss {
     565                 :            :         struct timer_list timer;
     566                 :            :         struct work_struct csa_connection_drop_work;
     567                 :            : 
     568                 :            :         unsigned long last_scan_completed;
     569                 :            : 
     570                 :            :         u32 basic_rates;
     571                 :            : 
     572                 :            :         bool fixed_bssid;
     573                 :            :         bool fixed_channel;
     574                 :            :         bool privacy;
     575                 :            : 
     576                 :            :         bool control_port;
     577                 :            :         bool userspace_handles_dfs;
     578                 :            : 
     579                 :            :         u8 bssid[ETH_ALEN] __aligned(2);
     580                 :            :         u8 ssid[IEEE80211_MAX_SSID_LEN];
     581                 :            :         u8 ssid_len, ie_len;
     582                 :            :         u8 *ie;
     583                 :            :         struct cfg80211_chan_def chandef;
     584                 :            : 
     585                 :            :         unsigned long ibss_join_req;
     586                 :            :         /* probe response/beacon for IBSS */
     587                 :            :         struct beacon_data __rcu *presp;
     588                 :            : 
     589                 :            :         struct ieee80211_ht_cap ht_capa; /* configured ht-cap over-rides */
     590                 :            :         struct ieee80211_ht_cap ht_capa_mask; /* Valid parts of ht_capa */
     591                 :            : 
     592                 :            :         spinlock_t incomplete_lock;
     593                 :            :         struct list_head incomplete_stations;
     594                 :            : 
     595                 :            :         enum {
     596                 :            :                 IEEE80211_IBSS_MLME_SEARCH,
     597                 :            :                 IEEE80211_IBSS_MLME_JOINED,
     598                 :            :         } state;
     599                 :            : };
     600                 :            : 
     601                 :            : /**
     602                 :            :  * struct ieee80211_if_ocb - OCB mode state
     603                 :            :  *
     604                 :            :  * @housekeeping_timer: timer for periodic invocation of a housekeeping task
     605                 :            :  * @wrkq_flags: OCB deferred task action
     606                 :            :  * @incomplete_lock: delayed STA insertion lock
     607                 :            :  * @incomplete_stations: list of STAs waiting for delayed insertion
     608                 :            :  * @joined: indication if the interface is connected to an OCB network
     609                 :            :  */
     610                 :            : struct ieee80211_if_ocb {
     611                 :            :         struct timer_list housekeeping_timer;
     612                 :            :         unsigned long wrkq_flags;
     613                 :            : 
     614                 :            :         spinlock_t incomplete_lock;
     615                 :            :         struct list_head incomplete_stations;
     616                 :            : 
     617                 :            :         bool joined;
     618                 :            : };
     619                 :            : 
     620                 :            : /**
     621                 :            :  * struct ieee80211_mesh_sync_ops - Extensible synchronization framework interface
     622                 :            :  *
     623                 :            :  * these declarations define the interface, which enables
     624                 :            :  * vendor-specific mesh synchronization
     625                 :            :  *
     626                 :            :  */
     627                 :            : struct ieee802_11_elems;
     628                 :            : struct ieee80211_mesh_sync_ops {
     629                 :            :         void (*rx_bcn_presp)(struct ieee80211_sub_if_data *sdata,
     630                 :            :                              u16 stype,
     631                 :            :                              struct ieee80211_mgmt *mgmt,
     632                 :            :                              struct ieee802_11_elems *elems,
     633                 :            :                              struct ieee80211_rx_status *rx_status);
     634                 :            : 
     635                 :            :         /* should be called with beacon_data under RCU read lock */
     636                 :            :         void (*adjust_tsf)(struct ieee80211_sub_if_data *sdata,
     637                 :            :                            struct beacon_data *beacon);
     638                 :            :         /* add other framework functions here */
     639                 :            : };
     640                 :            : 
     641                 :            : struct mesh_csa_settings {
     642                 :            :         struct rcu_head rcu_head;
     643                 :            :         struct cfg80211_csa_settings settings;
     644                 :            : };
     645                 :            : 
     646                 :            : struct ieee80211_if_mesh {
     647                 :            :         struct timer_list housekeeping_timer;
     648                 :            :         struct timer_list mesh_path_timer;
     649                 :            :         struct timer_list mesh_path_root_timer;
     650                 :            : 
     651                 :            :         unsigned long wrkq_flags;
     652                 :            :         unsigned long mbss_changed;
     653                 :            : 
     654                 :            :         bool userspace_handles_dfs;
     655                 :            : 
     656                 :            :         u8 mesh_id[IEEE80211_MAX_MESH_ID_LEN];
     657                 :            :         size_t mesh_id_len;
     658                 :            :         /* Active Path Selection Protocol Identifier */
     659                 :            :         u8 mesh_pp_id;
     660                 :            :         /* Active Path Selection Metric Identifier */
     661                 :            :         u8 mesh_pm_id;
     662                 :            :         /* Congestion Control Mode Identifier */
     663                 :            :         u8 mesh_cc_id;
     664                 :            :         /* Synchronization Protocol Identifier */
     665                 :            :         u8 mesh_sp_id;
     666                 :            :         /* Authentication Protocol Identifier */
     667                 :            :         u8 mesh_auth_id;
     668                 :            :         /* Local mesh Sequence Number */
     669                 :            :         u32 sn;
     670                 :            :         /* Last used PREQ ID */
     671                 :            :         u32 preq_id;
     672                 :            :         atomic_t mpaths;
     673                 :            :         /* Timestamp of last SN update */
     674                 :            :         unsigned long last_sn_update;
     675                 :            :         /* Time when it's ok to send next PERR */
     676                 :            :         unsigned long next_perr;
     677                 :            :         /* Timestamp of last PREQ sent */
     678                 :            :         unsigned long last_preq;
     679                 :            :         struct mesh_rmc *rmc;
     680                 :            :         spinlock_t mesh_preq_queue_lock;
     681                 :            :         struct mesh_preq_queue preq_queue;
     682                 :            :         int preq_queue_len;
     683                 :            :         struct mesh_stats mshstats;
     684                 :            :         struct mesh_config mshcfg;
     685                 :            :         atomic_t estab_plinks;
     686                 :            :         u32 mesh_seqnum;
     687                 :            :         bool accepting_plinks;
     688                 :            :         int num_gates;
     689                 :            :         struct beacon_data __rcu *beacon;
     690                 :            :         const u8 *ie;
     691                 :            :         u8 ie_len;
     692                 :            :         enum {
     693                 :            :                 IEEE80211_MESH_SEC_NONE = 0x0,
     694                 :            :                 IEEE80211_MESH_SEC_AUTHED = 0x1,
     695                 :            :                 IEEE80211_MESH_SEC_SECURED = 0x2,
     696                 :            :         } security;
     697                 :            :         bool user_mpm;
     698                 :            :         /* Extensible Synchronization Framework */
     699                 :            :         const struct ieee80211_mesh_sync_ops *sync_ops;
     700                 :            :         s64 sync_offset_clockdrift_max;
     701                 :            :         spinlock_t sync_offset_lock;
     702                 :            :         /* mesh power save */
     703                 :            :         enum nl80211_mesh_power_mode nonpeer_pm;
     704                 :            :         int ps_peers_light_sleep;
     705                 :            :         int ps_peers_deep_sleep;
     706                 :            :         struct ps_data ps;
     707                 :            :         /* Channel Switching Support */
     708                 :            :         struct mesh_csa_settings __rcu *csa;
     709                 :            :         enum {
     710                 :            :                 IEEE80211_MESH_CSA_ROLE_NONE,
     711                 :            :                 IEEE80211_MESH_CSA_ROLE_INIT,
     712                 :            :                 IEEE80211_MESH_CSA_ROLE_REPEATER,
     713                 :            :         } csa_role;
     714                 :            :         u8 chsw_ttl;
     715                 :            :         u16 pre_value;
     716                 :            : 
     717                 :            :         /* offset from skb->data while building IE */
     718                 :            :         int meshconf_offset;
     719                 :            : 
     720                 :            :         struct mesh_table *mesh_paths;
     721                 :            :         struct mesh_table *mpp_paths; /* Store paths for MPP&MAP */
     722                 :            :         int mesh_paths_generation;
     723                 :            :         int mpp_paths_generation;
     724                 :            : };
     725                 :            : 
     726                 :            : #ifdef CONFIG_MAC80211_MESH
     727                 :            : #define IEEE80211_IFSTA_MESH_CTR_INC(msh, name) \
     728                 :            :         do { (msh)->mshstats.name++; } while (0)
     729                 :            : #else
     730                 :            : #define IEEE80211_IFSTA_MESH_CTR_INC(msh, name) \
     731                 :            :         do { } while (0)
     732                 :            : #endif
     733                 :            : 
     734                 :            : /**
     735                 :            :  * enum ieee80211_sub_if_data_flags - virtual interface flags
     736                 :            :  *
     737                 :            :  * @IEEE80211_SDATA_ALLMULTI: interface wants all multicast packets
     738                 :            :  * @IEEE80211_SDATA_OPERATING_GMODE: operating in G-only mode
     739                 :            :  * @IEEE80211_SDATA_DONT_BRIDGE_PACKETS: bridge packets between
     740                 :            :  *      associated stations and deliver multicast frames both
     741                 :            :  *      back to wireless media and to the local net stack.
     742                 :            :  * @IEEE80211_SDATA_DISCONNECT_RESUME: Disconnect after resume.
     743                 :            :  * @IEEE80211_SDATA_IN_DRIVER: indicates interface was added to driver
     744                 :            :  */
     745                 :            : enum ieee80211_sub_if_data_flags {
     746                 :            :         IEEE80211_SDATA_ALLMULTI                = BIT(0),
     747                 :            :         IEEE80211_SDATA_OPERATING_GMODE         = BIT(2),
     748                 :            :         IEEE80211_SDATA_DONT_BRIDGE_PACKETS     = BIT(3),
     749                 :            :         IEEE80211_SDATA_DISCONNECT_RESUME       = BIT(4),
     750                 :            :         IEEE80211_SDATA_IN_DRIVER               = BIT(5),
     751                 :            : };
     752                 :            : 
     753                 :            : /**
     754                 :            :  * enum ieee80211_sdata_state_bits - virtual interface state bits
     755                 :            :  * @SDATA_STATE_RUNNING: virtual interface is up & running; this
     756                 :            :  *      mirrors netif_running() but is separate for interface type
     757                 :            :  *      change handling while the interface is up
     758                 :            :  * @SDATA_STATE_OFFCHANNEL: This interface is currently in offchannel
     759                 :            :  *      mode, so queues are stopped
     760                 :            :  * @SDATA_STATE_OFFCHANNEL_BEACON_STOPPED: Beaconing was stopped due
     761                 :            :  *      to offchannel, reset when offchannel returns
     762                 :            :  */
     763                 :            : enum ieee80211_sdata_state_bits {
     764                 :            :         SDATA_STATE_RUNNING,
     765                 :            :         SDATA_STATE_OFFCHANNEL,
     766                 :            :         SDATA_STATE_OFFCHANNEL_BEACON_STOPPED,
     767                 :            : };
     768                 :            : 
     769                 :            : /**
     770                 :            :  * enum ieee80211_chanctx_mode - channel context configuration mode
     771                 :            :  *
     772                 :            :  * @IEEE80211_CHANCTX_SHARED: channel context may be used by
     773                 :            :  *      multiple interfaces
     774                 :            :  * @IEEE80211_CHANCTX_EXCLUSIVE: channel context can be used
     775                 :            :  *      only by a single interface. This can be used for example for
     776                 :            :  *      non-fixed channel IBSS.
     777                 :            :  */
     778                 :            : enum ieee80211_chanctx_mode {
     779                 :            :         IEEE80211_CHANCTX_SHARED,
     780                 :            :         IEEE80211_CHANCTX_EXCLUSIVE
     781                 :            : };
     782                 :            : 
     783                 :            : /**
     784                 :            :  * enum ieee80211_chanctx_replace_state - channel context replacement state
     785                 :            :  *
     786                 :            :  * This is used for channel context in-place reservations that require channel
     787                 :            :  * context switch/swap.
     788                 :            :  *
     789                 :            :  * @IEEE80211_CHANCTX_REPLACE_NONE: no replacement is taking place
     790                 :            :  * @IEEE80211_CHANCTX_WILL_BE_REPLACED: this channel context will be replaced
     791                 :            :  *      by a (not yet registered) channel context pointed by %replace_ctx.
     792                 :            :  * @IEEE80211_CHANCTX_REPLACES_OTHER: this (not yet registered) channel context
     793                 :            :  *      replaces an existing channel context pointed to by %replace_ctx.
     794                 :            :  */
     795                 :            : enum ieee80211_chanctx_replace_state {
     796                 :            :         IEEE80211_CHANCTX_REPLACE_NONE,
     797                 :            :         IEEE80211_CHANCTX_WILL_BE_REPLACED,
     798                 :            :         IEEE80211_CHANCTX_REPLACES_OTHER,
     799                 :            : };
     800                 :            : 
     801                 :            : struct ieee80211_chanctx {
     802                 :            :         struct list_head list;
     803                 :            :         struct rcu_head rcu_head;
     804                 :            : 
     805                 :            :         struct list_head assigned_vifs;
     806                 :            :         struct list_head reserved_vifs;
     807                 :            : 
     808                 :            :         enum ieee80211_chanctx_replace_state replace_state;
     809                 :            :         struct ieee80211_chanctx *replace_ctx;
     810                 :            : 
     811                 :            :         enum ieee80211_chanctx_mode mode;
     812                 :            :         bool driver_present;
     813                 :            : 
     814                 :            :         struct ieee80211_chanctx_conf conf;
     815                 :            : };
     816                 :            : 
     817                 :            : struct mac80211_qos_map {
     818                 :            :         struct cfg80211_qos_map qos_map;
     819                 :            :         struct rcu_head rcu_head;
     820                 :            : };
     821                 :            : 
     822                 :            : enum txq_info_flags {
     823                 :            :         IEEE80211_TXQ_STOP,
     824                 :            :         IEEE80211_TXQ_AMPDU,
     825                 :            :         IEEE80211_TXQ_NO_AMSDU,
     826                 :            :         IEEE80211_TXQ_STOP_NETIF_TX,
     827                 :            : };
     828                 :            : 
     829                 :            : /**
     830                 :            :  * struct txq_info - per tid queue
     831                 :            :  *
     832                 :            :  * @tin: contains packets split into multiple flows
     833                 :            :  * @def_flow: used as a fallback flow when a packet destined to @tin hashes to
     834                 :            :  *      a fq_flow which is already owned by a different tin
     835                 :            :  * @def_cvars: codel vars for @def_flow
     836                 :            :  * @frags: used to keep fragments created after dequeue
     837                 :            :  * @schedule_order: used with ieee80211_local->active_txqs
     838                 :            :  * @schedule_round: counter to prevent infinite loops on TXQ scheduling
     839                 :            :  */
     840                 :            : struct txq_info {
     841                 :            :         struct fq_tin tin;
     842                 :            :         struct fq_flow def_flow;
     843                 :            :         struct codel_vars def_cvars;
     844                 :            :         struct codel_stats cstats;
     845                 :            :         struct sk_buff_head frags;
     846                 :            :         struct list_head schedule_order;
     847                 :            :         u16 schedule_round;
     848                 :            :         unsigned long flags;
     849                 :            : 
     850                 :            :         /* keep last! */
     851                 :            :         struct ieee80211_txq txq;
     852                 :            : };
     853                 :            : 
     854                 :            : struct ieee80211_if_mntr {
     855                 :            :         u32 flags;
     856                 :            :         u8 mu_follow_addr[ETH_ALEN] __aligned(2);
     857                 :            : 
     858                 :            :         struct list_head list;
     859                 :            : };
     860                 :            : 
     861                 :            : /**
     862                 :            :  * struct ieee80211_if_nan - NAN state
     863                 :            :  *
     864                 :            :  * @conf: current NAN configuration
     865                 :            :  * @func_ids: a bitmap of available instance_id's
     866                 :            :  */
     867                 :            : struct ieee80211_if_nan {
     868                 :            :         struct cfg80211_nan_conf conf;
     869                 :            : 
     870                 :            :         /* protects function_inst_ids */
     871                 :            :         spinlock_t func_lock;
     872                 :            :         struct idr function_inst_ids;
     873                 :            : };
     874                 :            : 
     875                 :            : struct ieee80211_sub_if_data {
     876                 :            :         struct list_head list;
     877                 :            : 
     878                 :            :         struct wireless_dev wdev;
     879                 :            : 
     880                 :            :         /* keys */
     881                 :            :         struct list_head key_list;
     882                 :            : 
     883                 :            :         /* count for keys needing tailroom space allocation */
     884                 :            :         int crypto_tx_tailroom_needed_cnt;
     885                 :            :         int crypto_tx_tailroom_pending_dec;
     886                 :            :         struct delayed_work dec_tailroom_needed_wk;
     887                 :            : 
     888                 :            :         struct net_device *dev;
     889                 :            :         struct ieee80211_local *local;
     890                 :            : 
     891                 :            :         unsigned int flags;
     892                 :            : 
     893                 :            :         unsigned long state;
     894                 :            : 
     895                 :            :         char name[IFNAMSIZ];
     896                 :            : 
     897                 :            :         /* Fragment table for host-based reassembly */
     898                 :            :         struct ieee80211_fragment_entry fragments[IEEE80211_FRAGMENT_MAX];
     899                 :            :         unsigned int fragment_next;
     900                 :            : 
     901                 :            :         /* TID bitmap for NoAck policy */
     902                 :            :         u16 noack_map;
     903                 :            : 
     904                 :            :         /* bit field of ACM bits (BIT(802.1D tag)) */
     905                 :            :         u8 wmm_acm;
     906                 :            : 
     907                 :            :         struct ieee80211_key __rcu *keys[NUM_DEFAULT_KEYS + NUM_DEFAULT_MGMT_KEYS];
     908                 :            :         struct ieee80211_key __rcu *default_unicast_key;
     909                 :            :         struct ieee80211_key __rcu *default_multicast_key;
     910                 :            :         struct ieee80211_key __rcu *default_mgmt_key;
     911                 :            : 
     912                 :            :         u16 sequence_number;
     913                 :            :         __be16 control_port_protocol;
     914                 :            :         bool control_port_no_encrypt;
     915                 :            :         bool control_port_over_nl80211;
     916                 :            :         int encrypt_headroom;
     917                 :            : 
     918                 :            :         atomic_t num_tx_queued;
     919                 :            :         struct ieee80211_tx_queue_params tx_conf[IEEE80211_NUM_ACS];
     920                 :            :         struct mac80211_qos_map __rcu *qos_map;
     921                 :            : 
     922                 :            :         struct work_struct csa_finalize_work;
     923                 :            :         bool csa_block_tx; /* write-protected by sdata_lock and local->mtx */
     924                 :            :         struct cfg80211_chan_def csa_chandef;
     925                 :            : 
     926                 :            :         struct list_head assigned_chanctx_list; /* protected by chanctx_mtx */
     927                 :            :         struct list_head reserved_chanctx_list; /* protected by chanctx_mtx */
     928                 :            : 
     929                 :            :         /* context reservation -- protected with chanctx_mtx */
     930                 :            :         struct ieee80211_chanctx *reserved_chanctx;
     931                 :            :         struct cfg80211_chan_def reserved_chandef;
     932                 :            :         bool reserved_radar_required;
     933                 :            :         bool reserved_ready;
     934                 :            : 
     935                 :            :         /* used to reconfigure hardware SM PS */
     936                 :            :         struct work_struct recalc_smps;
     937                 :            : 
     938                 :            :         struct work_struct work;
     939                 :            :         struct sk_buff_head skb_queue;
     940                 :            : 
     941                 :            :         u8 needed_rx_chains;
     942                 :            :         enum ieee80211_smps_mode smps_mode;
     943                 :            : 
     944                 :            :         int user_power_level; /* in dBm */
     945                 :            :         int ap_power_level; /* in dBm */
     946                 :            : 
     947                 :            :         bool radar_required;
     948                 :            :         struct delayed_work dfs_cac_timer_work;
     949                 :            : 
     950                 :            :         /*
     951                 :            :          * AP this belongs to: self in AP mode and
     952                 :            :          * corresponding AP in VLAN mode, NULL for
     953                 :            :          * all others (might be needed later in IBSS)
     954                 :            :          */
     955                 :            :         struct ieee80211_if_ap *bss;
     956                 :            : 
     957                 :            :         /* bitmap of allowed (non-MCS) rate indexes for rate control */
     958                 :            :         u32 rc_rateidx_mask[NUM_NL80211_BANDS];
     959                 :            : 
     960                 :            :         bool rc_has_mcs_mask[NUM_NL80211_BANDS];
     961                 :            :         u8  rc_rateidx_mcs_mask[NUM_NL80211_BANDS][IEEE80211_HT_MCS_MASK_LEN];
     962                 :            : 
     963                 :            :         bool rc_has_vht_mcs_mask[NUM_NL80211_BANDS];
     964                 :            :         u16 rc_rateidx_vht_mcs_mask[NUM_NL80211_BANDS][NL80211_VHT_NSS_MAX];
     965                 :            : 
     966                 :            :         union {
     967                 :            :                 struct ieee80211_if_ap ap;
     968                 :            :                 struct ieee80211_if_wds wds;
     969                 :            :                 struct ieee80211_if_vlan vlan;
     970                 :            :                 struct ieee80211_if_managed mgd;
     971                 :            :                 struct ieee80211_if_ibss ibss;
     972                 :            :                 struct ieee80211_if_mesh mesh;
     973                 :            :                 struct ieee80211_if_ocb ocb;
     974                 :            :                 struct ieee80211_if_mntr mntr;
     975                 :            :                 struct ieee80211_if_nan nan;
     976                 :            :         } u;
     977                 :            : 
     978                 :            : #ifdef CONFIG_MAC80211_DEBUGFS
     979                 :            :         struct {
     980                 :            :                 struct dentry *subdir_stations;
     981                 :            :                 struct dentry *default_unicast_key;
     982                 :            :                 struct dentry *default_multicast_key;
     983                 :            :                 struct dentry *default_mgmt_key;
     984                 :            :         } debugfs;
     985                 :            : #endif
     986                 :            : 
     987                 :            :         /* must be last, dynamically sized area in this! */
     988                 :            :         struct ieee80211_vif vif;
     989                 :            : };
     990                 :            : 
     991                 :            : static inline
     992                 :          0 : struct ieee80211_sub_if_data *vif_to_sdata(struct ieee80211_vif *p)
     993                 :            : {
     994   [ #  #  #  #  :          0 :         return container_of(p, struct ieee80211_sub_if_data, vif);
          #  #  #  #  #  
             #  #  #  #  
                      # ]
     995                 :            : }
     996                 :            : 
     997                 :          0 : static inline void sdata_lock(struct ieee80211_sub_if_data *sdata)
     998                 :            :         __acquires(&sdata->wdev.mtx)
     999                 :            : {
    1000                 :          0 :         mutex_lock(&sdata->wdev.mtx);
    1001   [ #  #  #  #  :          0 :         __acquire(&sdata->wdev.mtx);
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                      # ]
    1002                 :            : }
    1003                 :            : 
    1004                 :          0 : static inline void sdata_unlock(struct ieee80211_sub_if_data *sdata)
    1005                 :            :         __releases(&sdata->wdev.mtx)
    1006                 :            : {
    1007                 :          0 :         mutex_unlock(&sdata->wdev.mtx);
    1008                 :          0 :         __release(&sdata->wdev.mtx);
    1009                 :          0 : }
    1010                 :            : 
    1011                 :            : #define sdata_dereference(p, sdata) \
    1012                 :            :         rcu_dereference_protected(p, lockdep_is_held(&sdata->wdev.mtx))
    1013                 :            : 
    1014                 :            : static inline void
    1015                 :          0 : sdata_assert_lock(struct ieee80211_sub_if_data *sdata)
    1016                 :            : {
    1017   [ #  #  #  #  :          0 :         lockdep_assert_held(&sdata->wdev.mtx);
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
             #  #  #  #  
                      # ]
    1018                 :            : }
    1019                 :            : 
    1020                 :            : static inline int
    1021                 :          0 : ieee80211_chandef_get_shift(struct cfg80211_chan_def *chandef)
    1022                 :            : {
    1023   [ #  #  #  #  :          0 :         switch (chandef->width) {
                   #  # ]
    1024                 :            :         case NL80211_CHAN_WIDTH_5:
    1025                 :            :                 return 2;
    1026                 :          0 :         case NL80211_CHAN_WIDTH_10:
    1027                 :          0 :                 return 1;
    1028                 :          0 :         default:
    1029                 :          0 :                 return 0;
    1030                 :            :         }
    1031                 :            : }
    1032                 :            : 
    1033                 :            : static inline int
    1034                 :          0 : ieee80211_vif_get_shift(struct ieee80211_vif *vif)
    1035                 :            : {
    1036                 :          0 :         struct ieee80211_chanctx_conf *chanctx_conf;
    1037                 :          0 :         int shift = 0;
    1038                 :            : 
    1039                 :          0 :         rcu_read_lock();
    1040   [ #  #  #  #  :          0 :         chanctx_conf = rcu_dereference(vif->chanctx_conf);
          #  #  #  #  #  
                #  #  # ]
    1041   [ #  #  #  #  :          0 :         if (chanctx_conf)
          #  #  #  #  #  
                #  #  # ]
    1042   [ #  #  #  #  :          0 :                 shift = ieee80211_chandef_get_shift(&chanctx_conf->def);
          #  #  #  #  #  
          #  #  #  #  #  
             #  #  #  # ]
    1043                 :          0 :         rcu_read_unlock();
    1044                 :            : 
    1045      [ #  #  # ]:          0 :         return shift;
    1046                 :            : }
    1047                 :            : 
    1048                 :            : enum {
    1049                 :            :         IEEE80211_RX_MSG        = 1,
    1050                 :            :         IEEE80211_TX_STATUS_MSG = 2,
    1051                 :            : };
    1052                 :            : 
    1053                 :            : enum queue_stop_reason {
    1054                 :            :         IEEE80211_QUEUE_STOP_REASON_DRIVER,
    1055                 :            :         IEEE80211_QUEUE_STOP_REASON_PS,
    1056                 :            :         IEEE80211_QUEUE_STOP_REASON_CSA,
    1057                 :            :         IEEE80211_QUEUE_STOP_REASON_AGGREGATION,
    1058                 :            :         IEEE80211_QUEUE_STOP_REASON_SUSPEND,
    1059                 :            :         IEEE80211_QUEUE_STOP_REASON_SKB_ADD,
    1060                 :            :         IEEE80211_QUEUE_STOP_REASON_OFFCHANNEL,
    1061                 :            :         IEEE80211_QUEUE_STOP_REASON_FLUSH,
    1062                 :            :         IEEE80211_QUEUE_STOP_REASON_TDLS_TEARDOWN,
    1063                 :            :         IEEE80211_QUEUE_STOP_REASON_RESERVE_TID,
    1064                 :            : 
    1065                 :            :         IEEE80211_QUEUE_STOP_REASONS,
    1066                 :            : };
    1067                 :            : 
    1068                 :            : #ifdef CONFIG_MAC80211_LEDS
    1069                 :            : struct tpt_led_trigger {
    1070                 :            :         char name[32];
    1071                 :            :         const struct ieee80211_tpt_blink *blink_table;
    1072                 :            :         unsigned int blink_table_len;
    1073                 :            :         struct timer_list timer;
    1074                 :            :         struct ieee80211_local *local;
    1075                 :            :         unsigned long prev_traffic;
    1076                 :            :         unsigned long tx_bytes, rx_bytes;
    1077                 :            :         unsigned int active, want;
    1078                 :            :         bool running;
    1079                 :            : };
    1080                 :            : #endif
    1081                 :            : 
    1082                 :            : /**
    1083                 :            :  * mac80211 scan flags - currently active scan mode
    1084                 :            :  *
    1085                 :            :  * @SCAN_SW_SCANNING: We're currently in the process of scanning but may as
    1086                 :            :  *      well be on the operating channel
    1087                 :            :  * @SCAN_HW_SCANNING: The hardware is scanning for us, we have no way to
    1088                 :            :  *      determine if we are on the operating channel or not
    1089                 :            :  * @SCAN_ONCHANNEL_SCANNING:  Do a software scan on only the current operating
    1090                 :            :  *      channel. This should not interrupt normal traffic.
    1091                 :            :  * @SCAN_COMPLETED: Set for our scan work function when the driver reported
    1092                 :            :  *      that the scan completed.
    1093                 :            :  * @SCAN_ABORTED: Set for our scan work function when the driver reported
    1094                 :            :  *      a scan complete for an aborted scan.
    1095                 :            :  * @SCAN_HW_CANCELLED: Set for our scan work function when the scan is being
    1096                 :            :  *      cancelled.
    1097                 :            :  */
    1098                 :            : enum {
    1099                 :            :         SCAN_SW_SCANNING,
    1100                 :            :         SCAN_HW_SCANNING,
    1101                 :            :         SCAN_ONCHANNEL_SCANNING,
    1102                 :            :         SCAN_COMPLETED,
    1103                 :            :         SCAN_ABORTED,
    1104                 :            :         SCAN_HW_CANCELLED,
    1105                 :            : };
    1106                 :            : 
    1107                 :            : /**
    1108                 :            :  * enum mac80211_scan_state - scan state machine states
    1109                 :            :  *
    1110                 :            :  * @SCAN_DECISION: Main entry point to the scan state machine, this state
    1111                 :            :  *      determines if we should keep on scanning or switch back to the
    1112                 :            :  *      operating channel
    1113                 :            :  * @SCAN_SET_CHANNEL: Set the next channel to be scanned
    1114                 :            :  * @SCAN_SEND_PROBE: Send probe requests and wait for probe responses
    1115                 :            :  * @SCAN_SUSPEND: Suspend the scan and go back to operating channel to
    1116                 :            :  *      send out data
    1117                 :            :  * @SCAN_RESUME: Resume the scan and scan the next channel
    1118                 :            :  * @SCAN_ABORT: Abort the scan and go back to operating channel
    1119                 :            :  */
    1120                 :            : enum mac80211_scan_state {
    1121                 :            :         SCAN_DECISION,
    1122                 :            :         SCAN_SET_CHANNEL,
    1123                 :            :         SCAN_SEND_PROBE,
    1124                 :            :         SCAN_SUSPEND,
    1125                 :            :         SCAN_RESUME,
    1126                 :            :         SCAN_ABORT,
    1127                 :            : };
    1128                 :            : 
    1129                 :            : struct ieee80211_local {
    1130                 :            :         /* embed the driver visible part.
    1131                 :            :          * don't cast (use the static inlines below), but we keep
    1132                 :            :          * it first anyway so they become a no-op */
    1133                 :            :         struct ieee80211_hw hw;
    1134                 :            : 
    1135                 :            :         struct fq fq;
    1136                 :            :         struct codel_vars *cvars;
    1137                 :            :         struct codel_params cparams;
    1138                 :            : 
    1139                 :            :         /* protects active_txqs and txqi->schedule_order */
    1140                 :            :         spinlock_t active_txq_lock[IEEE80211_NUM_ACS];
    1141                 :            :         struct list_head active_txqs[IEEE80211_NUM_ACS];
    1142                 :            :         u16 schedule_round[IEEE80211_NUM_ACS];
    1143                 :            : 
    1144                 :            :         u16 airtime_flags;
    1145                 :            :         u32 aql_txq_limit_low[IEEE80211_NUM_ACS];
    1146                 :            :         u32 aql_txq_limit_high[IEEE80211_NUM_ACS];
    1147                 :            :         u32 aql_threshold;
    1148                 :            :         atomic_t aql_total_pending_airtime;
    1149                 :            : 
    1150                 :            :         const struct ieee80211_ops *ops;
    1151                 :            : 
    1152                 :            :         /*
    1153                 :            :          * private workqueue to mac80211. mac80211 makes this accessible
    1154                 :            :          * via ieee80211_queue_work()
    1155                 :            :          */
    1156                 :            :         struct workqueue_struct *workqueue;
    1157                 :            : 
    1158                 :            :         unsigned long queue_stop_reasons[IEEE80211_MAX_QUEUES];
    1159                 :            :         int q_stop_reasons[IEEE80211_MAX_QUEUES][IEEE80211_QUEUE_STOP_REASONS];
    1160                 :            :         /* also used to protect ampdu_ac_queue and amdpu_ac_stop_refcnt */
    1161                 :            :         spinlock_t queue_stop_reason_lock;
    1162                 :            : 
    1163                 :            :         int open_count;
    1164                 :            :         int monitors, cooked_mntrs;
    1165                 :            :         /* number of interfaces with corresponding FIF_ flags */
    1166                 :            :         int fif_fcsfail, fif_plcpfail, fif_control, fif_other_bss, fif_pspoll,
    1167                 :            :             fif_probe_req;
    1168                 :            :         int probe_req_reg;
    1169                 :            :         unsigned int filter_flags; /* FIF_* */
    1170                 :            : 
    1171                 :            :         bool wiphy_ciphers_allocated;
    1172                 :            : 
    1173                 :            :         bool use_chanctx;
    1174                 :            : 
    1175                 :            :         /* protects the aggregated multicast list and filter calls */
    1176                 :            :         spinlock_t filter_lock;
    1177                 :            : 
    1178                 :            :         /* used for uploading changed mc list */
    1179                 :            :         struct work_struct reconfig_filter;
    1180                 :            : 
    1181                 :            :         /* aggregated multicast list */
    1182                 :            :         struct netdev_hw_addr_list mc_list;
    1183                 :            : 
    1184                 :            :         bool tim_in_locked_section; /* see ieee80211_beacon_get() */
    1185                 :            : 
    1186                 :            :         /*
    1187                 :            :          * suspended is true if we finished all the suspend _and_ we have
    1188                 :            :          * not yet come up from resume. This is to be used by mac80211
    1189                 :            :          * to ensure driver sanity during suspend and mac80211's own
    1190                 :            :          * sanity. It can eventually be used for WoW as well.
    1191                 :            :          */
    1192                 :            :         bool suspended;
    1193                 :            : 
    1194                 :            :         /*
    1195                 :            :          * Resuming is true while suspended, but when we're reprogramming the
    1196                 :            :          * hardware -- at that time it's allowed to use ieee80211_queue_work()
    1197                 :            :          * again even though some other parts of the stack are still suspended
    1198                 :            :          * and we still drop received frames to avoid waking the stack.
    1199                 :            :          */
    1200                 :            :         bool resuming;
    1201                 :            : 
    1202                 :            :         /*
    1203                 :            :          * quiescing is true during the suspend process _only_ to
    1204                 :            :          * ease timer cancelling etc.
    1205                 :            :          */
    1206                 :            :         bool quiescing;
    1207                 :            : 
    1208                 :            :         /* device is started */
    1209                 :            :         bool started;
    1210                 :            : 
    1211                 :            :         /* device is during a HW reconfig */
    1212                 :            :         bool in_reconfig;
    1213                 :            : 
    1214                 :            :         /* wowlan is enabled -- don't reconfig on resume */
    1215                 :            :         bool wowlan;
    1216                 :            : 
    1217                 :            :         struct work_struct radar_detected_work;
    1218                 :            : 
    1219                 :            :         /* number of RX chains the hardware has */
    1220                 :            :         u8 rx_chains;
    1221                 :            : 
    1222                 :            :         /* bitmap of which sbands were copied */
    1223                 :            :         u8 sband_allocated;
    1224                 :            : 
    1225                 :            :         int tx_headroom; /* required headroom for hardware/radiotap */
    1226                 :            : 
    1227                 :            :         /* Tasklet and skb queue to process calls from IRQ mode. All frames
    1228                 :            :          * added to skb_queue will be processed, but frames in
    1229                 :            :          * skb_queue_unreliable may be dropped if the total length of these
    1230                 :            :          * queues increases over the limit. */
    1231                 :            : #define IEEE80211_IRQSAFE_QUEUE_LIMIT 128
    1232                 :            :         struct tasklet_struct tasklet;
    1233                 :            :         struct sk_buff_head skb_queue;
    1234                 :            :         struct sk_buff_head skb_queue_unreliable;
    1235                 :            : 
    1236                 :            :         spinlock_t rx_path_lock;
    1237                 :            : 
    1238                 :            :         /* Station data */
    1239                 :            :         /*
    1240                 :            :          * The mutex only protects the list, hash table and
    1241                 :            :          * counter, reads are done with RCU.
    1242                 :            :          */
    1243                 :            :         struct mutex sta_mtx;
    1244                 :            :         spinlock_t tim_lock;
    1245                 :            :         unsigned long num_sta;
    1246                 :            :         struct list_head sta_list;
    1247                 :            :         struct rhltable sta_hash;
    1248                 :            :         struct timer_list sta_cleanup;
    1249                 :            :         int sta_generation;
    1250                 :            : 
    1251                 :            :         struct sk_buff_head pending[IEEE80211_MAX_QUEUES];
    1252                 :            :         struct tasklet_struct tx_pending_tasklet;
    1253                 :            :         struct tasklet_struct wake_txqs_tasklet;
    1254                 :            : 
    1255                 :            :         atomic_t agg_queue_stop[IEEE80211_MAX_QUEUES];
    1256                 :            : 
    1257                 :            :         /* number of interfaces with allmulti RX */
    1258                 :            :         atomic_t iff_allmultis;
    1259                 :            : 
    1260                 :            :         struct rate_control_ref *rate_ctrl;
    1261                 :            : 
    1262                 :            :         struct arc4_ctx wep_tx_ctx;
    1263                 :            :         struct arc4_ctx wep_rx_ctx;
    1264                 :            :         u32 wep_iv;
    1265                 :            : 
    1266                 :            :         /* see iface.c */
    1267                 :            :         struct list_head interfaces;
    1268                 :            :         struct list_head mon_list; /* only that are IFF_UP && !cooked */
    1269                 :            :         struct mutex iflist_mtx;
    1270                 :            : 
    1271                 :            :         /*
    1272                 :            :          * Key mutex, protects sdata's key_list and sta_info's
    1273                 :            :          * key pointers and ptk_idx (write access, they're RCU.)
    1274                 :            :          */
    1275                 :            :         struct mutex key_mtx;
    1276                 :            : 
    1277                 :            :         /* mutex for scan and work locking */
    1278                 :            :         struct mutex mtx;
    1279                 :            : 
    1280                 :            :         /* Scanning and BSS list */
    1281                 :            :         unsigned long scanning;
    1282                 :            :         struct cfg80211_ssid scan_ssid;
    1283                 :            :         struct cfg80211_scan_request *int_scan_req;
    1284                 :            :         struct cfg80211_scan_request __rcu *scan_req;
    1285                 :            :         struct ieee80211_scan_request *hw_scan_req;
    1286                 :            :         struct cfg80211_chan_def scan_chandef;
    1287                 :            :         enum nl80211_band hw_scan_band;
    1288                 :            :         int scan_channel_idx;
    1289                 :            :         int scan_ies_len;
    1290                 :            :         int hw_scan_ies_bufsize;
    1291                 :            :         struct cfg80211_scan_info scan_info;
    1292                 :            : 
    1293                 :            :         struct work_struct sched_scan_stopped_work;
    1294                 :            :         struct ieee80211_sub_if_data __rcu *sched_scan_sdata;
    1295                 :            :         struct cfg80211_sched_scan_request __rcu *sched_scan_req;
    1296                 :            :         u8 scan_addr[ETH_ALEN];
    1297                 :            : 
    1298                 :            :         unsigned long leave_oper_channel_time;
    1299                 :            :         enum mac80211_scan_state next_scan_state;
    1300                 :            :         struct delayed_work scan_work;
    1301                 :            :         struct ieee80211_sub_if_data __rcu *scan_sdata;
    1302                 :            :         /* For backward compatibility only -- do not use */
    1303                 :            :         struct cfg80211_chan_def _oper_chandef;
    1304                 :            : 
    1305                 :            :         /* Temporary remain-on-channel for off-channel operations */
    1306                 :            :         struct ieee80211_channel *tmp_channel;
    1307                 :            : 
    1308                 :            :         /* channel contexts */
    1309                 :            :         struct list_head chanctx_list;
    1310                 :            :         struct mutex chanctx_mtx;
    1311                 :            : 
    1312                 :            : #ifdef CONFIG_MAC80211_LEDS
    1313                 :            :         struct led_trigger tx_led, rx_led, assoc_led, radio_led;
    1314                 :            :         struct led_trigger tpt_led;
    1315                 :            :         atomic_t tx_led_active, rx_led_active, assoc_led_active;
    1316                 :            :         atomic_t radio_led_active, tpt_led_active;
    1317                 :            :         struct tpt_led_trigger *tpt_led_trigger;
    1318                 :            : #endif
    1319                 :            : 
    1320                 :            : #ifdef CONFIG_MAC80211_DEBUG_COUNTERS
    1321                 :            :         /* SNMP counters */
    1322                 :            :         /* dot11CountersTable */
    1323                 :            :         u32 dot11TransmittedFragmentCount;
    1324                 :            :         u32 dot11MulticastTransmittedFrameCount;
    1325                 :            :         u32 dot11FailedCount;
    1326                 :            :         u32 dot11RetryCount;
    1327                 :            :         u32 dot11MultipleRetryCount;
    1328                 :            :         u32 dot11FrameDuplicateCount;
    1329                 :            :         u32 dot11ReceivedFragmentCount;
    1330                 :            :         u32 dot11MulticastReceivedFrameCount;
    1331                 :            :         u32 dot11TransmittedFrameCount;
    1332                 :            : 
    1333                 :            :         /* TX/RX handler statistics */
    1334                 :            :         unsigned int tx_handlers_drop;
    1335                 :            :         unsigned int tx_handlers_queued;
    1336                 :            :         unsigned int tx_handlers_drop_wep;
    1337                 :            :         unsigned int tx_handlers_drop_not_assoc;
    1338                 :            :         unsigned int tx_handlers_drop_unauth_port;
    1339                 :            :         unsigned int rx_handlers_drop;
    1340                 :            :         unsigned int rx_handlers_queued;
    1341                 :            :         unsigned int rx_handlers_drop_nullfunc;
    1342                 :            :         unsigned int rx_handlers_drop_defrag;
    1343                 :            :         unsigned int tx_expand_skb_head;
    1344                 :            :         unsigned int tx_expand_skb_head_cloned;
    1345                 :            :         unsigned int rx_expand_skb_head_defrag;
    1346                 :            :         unsigned int rx_handlers_fragments;
    1347                 :            :         unsigned int tx_status_drop;
    1348                 :            : #define I802_DEBUG_INC(c) (c)++
    1349                 :            : #else /* CONFIG_MAC80211_DEBUG_COUNTERS */
    1350                 :            : #define I802_DEBUG_INC(c) do { } while (0)
    1351                 :            : #endif /* CONFIG_MAC80211_DEBUG_COUNTERS */
    1352                 :            : 
    1353                 :            : 
    1354                 :            :         int total_ps_buffered; /* total number of all buffered unicast and
    1355                 :            :                                 * multicast packets for power saving stations
    1356                 :            :                                 */
    1357                 :            : 
    1358                 :            :         bool pspolling;
    1359                 :            :         bool offchannel_ps_enabled;
    1360                 :            :         /*
    1361                 :            :          * PS can only be enabled when we have exactly one managed
    1362                 :            :          * interface (and monitors) in PS, this then points there.
    1363                 :            :          */
    1364                 :            :         struct ieee80211_sub_if_data *ps_sdata;
    1365                 :            :         struct work_struct dynamic_ps_enable_work;
    1366                 :            :         struct work_struct dynamic_ps_disable_work;
    1367                 :            :         struct timer_list dynamic_ps_timer;
    1368                 :            :         struct notifier_block ifa_notifier;
    1369                 :            :         struct notifier_block ifa6_notifier;
    1370                 :            : 
    1371                 :            :         /*
    1372                 :            :          * The dynamic ps timeout configured from user space via WEXT -
    1373                 :            :          * this will override whatever chosen by mac80211 internally.
    1374                 :            :          */
    1375                 :            :         int dynamic_ps_forced_timeout;
    1376                 :            : 
    1377                 :            :         int user_power_level; /* in dBm, for all interfaces */
    1378                 :            : 
    1379                 :            :         enum ieee80211_smps_mode smps_mode;
    1380                 :            : 
    1381                 :            :         struct work_struct restart_work;
    1382                 :            : 
    1383                 :            : #ifdef CONFIG_MAC80211_DEBUGFS
    1384                 :            :         struct local_debugfsdentries {
    1385                 :            :                 struct dentry *rcdir;
    1386                 :            :                 struct dentry *keys;
    1387                 :            :         } debugfs;
    1388                 :            :         bool force_tx_status;
    1389                 :            : #endif
    1390                 :            : 
    1391                 :            :         /*
    1392                 :            :          * Remain-on-channel support
    1393                 :            :          */
    1394                 :            :         struct delayed_work roc_work;
    1395                 :            :         struct list_head roc_list;
    1396                 :            :         struct work_struct hw_roc_start, hw_roc_done;
    1397                 :            :         unsigned long hw_roc_start_time;
    1398                 :            :         u64 roc_cookie_counter;
    1399                 :            : 
    1400                 :            :         struct idr ack_status_frames;
    1401                 :            :         spinlock_t ack_status_lock;
    1402                 :            : 
    1403                 :            :         struct ieee80211_sub_if_data __rcu *p2p_sdata;
    1404                 :            : 
    1405                 :            :         /* virtual monitor interface */
    1406                 :            :         struct ieee80211_sub_if_data __rcu *monitor_sdata;
    1407                 :            :         struct cfg80211_chan_def monitor_chandef;
    1408                 :            : 
    1409                 :            :         /* extended capabilities provided by mac80211 */
    1410                 :            :         u8 ext_capa[8];
    1411                 :            : 
    1412                 :            :         /* TDLS channel switch */
    1413                 :            :         struct work_struct tdls_chsw_work;
    1414                 :            :         struct sk_buff_head skb_queue_tdls_chsw;
    1415                 :            : };
    1416                 :            : 
    1417                 :            : static inline struct ieee80211_sub_if_data *
    1418                 :          0 : IEEE80211_DEV_TO_SUB_IF(struct net_device *dev)
    1419                 :            : {
    1420   [ #  #  #  #  :          0 :         return netdev_priv(dev);
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                #  #  # ]
    1421                 :            : }
    1422                 :            : 
    1423                 :            : static inline struct ieee80211_sub_if_data *
    1424                 :          0 : IEEE80211_WDEV_TO_SUB_IF(struct wireless_dev *wdev)
    1425                 :            : {
    1426   [ #  #  #  #  :          0 :         return container_of(wdev, struct ieee80211_sub_if_data, wdev);
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                      # ]
    1427                 :            : }
    1428                 :            : 
    1429                 :            : static inline struct ieee80211_supported_band *
    1430                 :          0 : ieee80211_get_sband(struct ieee80211_sub_if_data *sdata)
    1431                 :            : {
    1432                 :          0 :         struct ieee80211_local *local = sdata->local;
    1433                 :          0 :         struct ieee80211_chanctx_conf *chanctx_conf;
    1434                 :          0 :         enum nl80211_band band;
    1435                 :            : 
    1436                 :          0 :         rcu_read_lock();
    1437         [ #  # ]:          0 :         chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
    1438                 :            : 
    1439   [ #  #  #  # ]:          0 :         if (WARN_ON_ONCE(!chanctx_conf)) {
    1440                 :          0 :                 rcu_read_unlock();
    1441                 :          0 :                 return NULL;
    1442                 :            :         }
    1443                 :            : 
    1444                 :          0 :         band = chanctx_conf->def.chan->band;
    1445                 :          0 :         rcu_read_unlock();
    1446                 :            : 
    1447                 :          0 :         return local->hw.wiphy->bands[band];
    1448                 :            : }
    1449                 :            : 
    1450                 :            : /* this struct holds the value parsing from channel switch IE  */
    1451                 :            : struct ieee80211_csa_ie {
    1452                 :            :         struct cfg80211_chan_def chandef;
    1453                 :            :         u8 mode;
    1454                 :            :         u8 count;
    1455                 :            :         u8 ttl;
    1456                 :            :         u16 pre_value;
    1457                 :            :         u16 reason_code;
    1458                 :            :         u32 max_switch_time;
    1459                 :            : };
    1460                 :            : 
    1461                 :            : /* Parsed Information Elements */
    1462                 :            : struct ieee802_11_elems {
    1463                 :            :         const u8 *ie_start;
    1464                 :            :         size_t total_len;
    1465                 :            : 
    1466                 :            :         /* pointers to IEs */
    1467                 :            :         const struct ieee80211_tdls_lnkie *lnk_id;
    1468                 :            :         const struct ieee80211_ch_switch_timing *ch_sw_timing;
    1469                 :            :         const u8 *ext_capab;
    1470                 :            :         const u8 *ssid;
    1471                 :            :         const u8 *supp_rates;
    1472                 :            :         const u8 *ds_params;
    1473                 :            :         const struct ieee80211_tim_ie *tim;
    1474                 :            :         const u8 *challenge;
    1475                 :            :         const u8 *rsn;
    1476                 :            :         const u8 *erp_info;
    1477                 :            :         const u8 *ext_supp_rates;
    1478                 :            :         const u8 *wmm_info;
    1479                 :            :         const u8 *wmm_param;
    1480                 :            :         const struct ieee80211_ht_cap *ht_cap_elem;
    1481                 :            :         const struct ieee80211_ht_operation *ht_operation;
    1482                 :            :         const struct ieee80211_vht_cap *vht_cap_elem;
    1483                 :            :         const struct ieee80211_vht_operation *vht_operation;
    1484                 :            :         const struct ieee80211_meshconf_ie *mesh_config;
    1485                 :            :         const u8 *he_cap;
    1486                 :            :         const struct ieee80211_he_operation *he_operation;
    1487                 :            :         const struct ieee80211_he_spr *he_spr;
    1488                 :            :         const struct ieee80211_mu_edca_param_set *mu_edca_param_set;
    1489                 :            :         const u8 *uora_element;
    1490                 :            :         const u8 *mesh_id;
    1491                 :            :         const u8 *peering;
    1492                 :            :         const __le16 *awake_window;
    1493                 :            :         const u8 *preq;
    1494                 :            :         const u8 *prep;
    1495                 :            :         const u8 *perr;
    1496                 :            :         const struct ieee80211_rann_ie *rann;
    1497                 :            :         const struct ieee80211_channel_sw_ie *ch_switch_ie;
    1498                 :            :         const struct ieee80211_ext_chansw_ie *ext_chansw_ie;
    1499                 :            :         const struct ieee80211_wide_bw_chansw_ie *wide_bw_chansw_ie;
    1500                 :            :         const u8 *max_channel_switch_time;
    1501                 :            :         const u8 *country_elem;
    1502                 :            :         const u8 *pwr_constr_elem;
    1503                 :            :         const u8 *cisco_dtpc_elem;
    1504                 :            :         const struct ieee80211_timeout_interval_ie *timeout_int;
    1505                 :            :         const u8 *opmode_notif;
    1506                 :            :         const struct ieee80211_sec_chan_offs_ie *sec_chan_offs;
    1507                 :            :         struct ieee80211_mesh_chansw_params_ie *mesh_chansw_params_ie;
    1508                 :            :         const struct ieee80211_bss_max_idle_period_ie *max_idle_period_ie;
    1509                 :            :         const struct ieee80211_multiple_bssid_configuration *mbssid_config_ie;
    1510                 :            :         const struct ieee80211_bssid_index *bssid_index;
    1511                 :            :         u8 max_bssid_indicator;
    1512                 :            :         u8 dtim_count;
    1513                 :            :         u8 dtim_period;
    1514                 :            :         const struct ieee80211_addba_ext_ie *addba_ext_ie;
    1515                 :            : 
    1516                 :            :         /* length of them, respectively */
    1517                 :            :         u8 ext_capab_len;
    1518                 :            :         u8 ssid_len;
    1519                 :            :         u8 supp_rates_len;
    1520                 :            :         u8 tim_len;
    1521                 :            :         u8 challenge_len;
    1522                 :            :         u8 rsn_len;
    1523                 :            :         u8 ext_supp_rates_len;
    1524                 :            :         u8 wmm_info_len;
    1525                 :            :         u8 wmm_param_len;
    1526                 :            :         u8 he_cap_len;
    1527                 :            :         u8 mesh_id_len;
    1528                 :            :         u8 peering_len;
    1529                 :            :         u8 preq_len;
    1530                 :            :         u8 prep_len;
    1531                 :            :         u8 perr_len;
    1532                 :            :         u8 country_elem_len;
    1533                 :            :         u8 bssid_index_len;
    1534                 :            : 
    1535                 :            :         /* whether a parse error occurred while retrieving these elements */
    1536                 :            :         bool parse_error;
    1537                 :            : };
    1538                 :            : 
    1539                 :         13 : static inline struct ieee80211_local *hw_to_local(
    1540                 :            :         struct ieee80211_hw *hw)
    1541                 :            : {
    1542   [ -  +  #  #  :         13 :         return container_of(hw, struct ieee80211_local, hw);
          #  #  #  #  #  
                      # ]
    1543                 :            : }
    1544                 :            : 
    1545                 :          0 : static inline struct txq_info *to_txq_info(struct ieee80211_txq *txq)
    1546                 :            : {
    1547         [ #  # ]:          0 :         return container_of(txq, struct txq_info, txq);
    1548                 :            : }
    1549                 :            : 
    1550                 :          0 : static inline bool txq_has_queue(struct ieee80211_txq *txq)
    1551                 :            : {
    1552                 :          0 :         struct txq_info *txqi = to_txq_info(txq);
    1553                 :            : 
    1554   [ #  #  #  #  :          0 :         return !(skb_queue_empty(&txqi->frags) && !txqi->tin.backlog_packets);
          #  #  #  #  #  
                #  #  # ]
    1555                 :            : }
    1556                 :            : 
    1557                 :          0 : static inline int ieee80211_bssid_match(const u8 *raddr, const u8 *addr)
    1558                 :            : {
    1559   [ #  #  #  #  :          0 :         return ether_addr_equal(raddr, addr) ||
             #  #  #  # ]
    1560                 :            :                is_broadcast_ether_addr(raddr);
    1561                 :            : }
    1562                 :            : 
    1563                 :            : static inline bool
    1564                 :          0 : ieee80211_have_rx_timestamp(struct ieee80211_rx_status *status)
    1565                 :            : {
    1566         [ #  # ]:          0 :         WARN_ON_ONCE(status->flag & RX_FLAG_MACTIME_START &&
    1567                 :            :                      status->flag & RX_FLAG_MACTIME_END);
    1568         [ #  # ]:          0 :         if (status->flag & (RX_FLAG_MACTIME_START | RX_FLAG_MACTIME_END))
    1569                 :            :                 return true;
    1570                 :            :         /* can't handle non-legacy preamble yet */
    1571         [ #  # ]:          0 :         if (status->flag & RX_FLAG_MACTIME_PLCP_START &&
    1572                 :            :             status->encoding == RX_ENC_LEGACY)
    1573                 :          0 :                 return true;
    1574                 :            :         return false;
    1575                 :            : }
    1576                 :            : 
    1577                 :            : void ieee80211_vif_inc_num_mcast(struct ieee80211_sub_if_data *sdata);
    1578                 :            : void ieee80211_vif_dec_num_mcast(struct ieee80211_sub_if_data *sdata);
    1579                 :            : 
    1580                 :            : /* This function returns the number of multicast stations connected to this
    1581                 :            :  * interface. It returns -1 if that number is not tracked, that is for netdevs
    1582                 :            :  * not in AP or AP_VLAN mode or when using 4addr.
    1583                 :            :  */
    1584                 :            : static inline int
    1585                 :          0 : ieee80211_vif_get_num_mcast_if(struct ieee80211_sub_if_data *sdata)
    1586                 :            : {
    1587         [ #  # ]:          0 :         if (sdata->vif.type == NL80211_IFTYPE_AP)
    1588                 :          0 :                 return atomic_read(&sdata->u.ap.num_mcast_sta);
    1589   [ #  #  #  # ]:          0 :         if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN && !sdata->u.vlan.sta)
    1590                 :          0 :                 return atomic_read(&sdata->u.vlan.num_mcast_sta);
    1591                 :            :         return -1;
    1592                 :            : }
    1593                 :            : 
    1594                 :            : u64 ieee80211_calculate_rx_timestamp(struct ieee80211_local *local,
    1595                 :            :                                      struct ieee80211_rx_status *status,
    1596                 :            :                                      unsigned int mpdu_len,
    1597                 :            :                                      unsigned int mpdu_offset);
    1598                 :            : int ieee80211_hw_config(struct ieee80211_local *local, u32 changed);
    1599                 :            : void ieee80211_tx_set_protected(struct ieee80211_tx_data *tx);
    1600                 :            : void ieee80211_bss_info_change_notify(struct ieee80211_sub_if_data *sdata,
    1601                 :            :                                       u32 changed);
    1602                 :            : void ieee80211_configure_filter(struct ieee80211_local *local);
    1603                 :            : u32 ieee80211_reset_erp_info(struct ieee80211_sub_if_data *sdata);
    1604                 :            : 
    1605                 :            : u64 ieee80211_mgmt_tx_cookie(struct ieee80211_local *local);
    1606                 :            : int ieee80211_attach_ack_skb(struct ieee80211_local *local, struct sk_buff *skb,
    1607                 :            :                              u64 *cookie, gfp_t gfp);
    1608                 :            : 
    1609                 :            : void ieee80211_check_fast_rx(struct sta_info *sta);
    1610                 :            : void __ieee80211_check_fast_rx_iface(struct ieee80211_sub_if_data *sdata);
    1611                 :            : void ieee80211_check_fast_rx_iface(struct ieee80211_sub_if_data *sdata);
    1612                 :            : void ieee80211_clear_fast_rx(struct sta_info *sta);
    1613                 :            : 
    1614                 :            : /* STA code */
    1615                 :            : void ieee80211_sta_setup_sdata(struct ieee80211_sub_if_data *sdata);
    1616                 :            : int ieee80211_mgd_auth(struct ieee80211_sub_if_data *sdata,
    1617                 :            :                        struct cfg80211_auth_request *req);
    1618                 :            : int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata,
    1619                 :            :                         struct cfg80211_assoc_request *req);
    1620                 :            : int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata,
    1621                 :            :                          struct cfg80211_deauth_request *req);
    1622                 :            : int ieee80211_mgd_disassoc(struct ieee80211_sub_if_data *sdata,
    1623                 :            :                            struct cfg80211_disassoc_request *req);
    1624                 :            : void ieee80211_send_pspoll(struct ieee80211_local *local,
    1625                 :            :                            struct ieee80211_sub_if_data *sdata);
    1626                 :            : void ieee80211_recalc_ps(struct ieee80211_local *local);
    1627                 :            : void ieee80211_recalc_ps_vif(struct ieee80211_sub_if_data *sdata);
    1628                 :            : int ieee80211_set_arp_filter(struct ieee80211_sub_if_data *sdata);
    1629                 :            : void ieee80211_sta_work(struct ieee80211_sub_if_data *sdata);
    1630                 :            : void ieee80211_sta_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
    1631                 :            :                                   struct sk_buff *skb);
    1632                 :            : void ieee80211_sta_reset_beacon_monitor(struct ieee80211_sub_if_data *sdata);
    1633                 :            : void ieee80211_sta_reset_conn_monitor(struct ieee80211_sub_if_data *sdata);
    1634                 :            : void ieee80211_mgd_stop(struct ieee80211_sub_if_data *sdata);
    1635                 :            : void ieee80211_mgd_conn_tx_status(struct ieee80211_sub_if_data *sdata,
    1636                 :            :                                   __le16 fc, bool acked);
    1637                 :            : void ieee80211_mgd_quiesce(struct ieee80211_sub_if_data *sdata);
    1638                 :            : void ieee80211_sta_restart(struct ieee80211_sub_if_data *sdata);
    1639                 :            : void ieee80211_sta_handle_tspec_ac_params(struct ieee80211_sub_if_data *sdata);
    1640                 :            : 
    1641                 :            : /* IBSS code */
    1642                 :            : void ieee80211_ibss_notify_scan_completed(struct ieee80211_local *local);
    1643                 :            : void ieee80211_ibss_setup_sdata(struct ieee80211_sub_if_data *sdata);
    1644                 :            : void ieee80211_ibss_rx_no_sta(struct ieee80211_sub_if_data *sdata,
    1645                 :            :                               const u8 *bssid, const u8 *addr, u32 supp_rates);
    1646                 :            : int ieee80211_ibss_join(struct ieee80211_sub_if_data *sdata,
    1647                 :            :                         struct cfg80211_ibss_params *params);
    1648                 :            : int ieee80211_ibss_leave(struct ieee80211_sub_if_data *sdata);
    1649                 :            : void ieee80211_ibss_work(struct ieee80211_sub_if_data *sdata);
    1650                 :            : void ieee80211_ibss_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
    1651                 :            :                                    struct sk_buff *skb);
    1652                 :            : int ieee80211_ibss_csa_beacon(struct ieee80211_sub_if_data *sdata,
    1653                 :            :                               struct cfg80211_csa_settings *csa_settings);
    1654                 :            : int ieee80211_ibss_finish_csa(struct ieee80211_sub_if_data *sdata);
    1655                 :            : void ieee80211_ibss_stop(struct ieee80211_sub_if_data *sdata);
    1656                 :            : 
    1657                 :            : /* OCB code */
    1658                 :            : void ieee80211_ocb_work(struct ieee80211_sub_if_data *sdata);
    1659                 :            : void ieee80211_ocb_rx_no_sta(struct ieee80211_sub_if_data *sdata,
    1660                 :            :                              const u8 *bssid, const u8 *addr, u32 supp_rates);
    1661                 :            : void ieee80211_ocb_setup_sdata(struct ieee80211_sub_if_data *sdata);
    1662                 :            : int ieee80211_ocb_join(struct ieee80211_sub_if_data *sdata,
    1663                 :            :                        struct ocb_setup *setup);
    1664                 :            : int ieee80211_ocb_leave(struct ieee80211_sub_if_data *sdata);
    1665                 :            : 
    1666                 :            : /* mesh code */
    1667                 :            : void ieee80211_mesh_work(struct ieee80211_sub_if_data *sdata);
    1668                 :            : void ieee80211_mesh_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
    1669                 :            :                                    struct sk_buff *skb);
    1670                 :            : int ieee80211_mesh_csa_beacon(struct ieee80211_sub_if_data *sdata,
    1671                 :            :                               struct cfg80211_csa_settings *csa_settings);
    1672                 :            : int ieee80211_mesh_finish_csa(struct ieee80211_sub_if_data *sdata);
    1673                 :            : 
    1674                 :            : /* scan/BSS handling */
    1675                 :            : void ieee80211_scan_work(struct work_struct *work);
    1676                 :            : int ieee80211_request_ibss_scan(struct ieee80211_sub_if_data *sdata,
    1677                 :            :                                 const u8 *ssid, u8 ssid_len,
    1678                 :            :                                 struct ieee80211_channel **channels,
    1679                 :            :                                 unsigned int n_channels,
    1680                 :            :                                 enum nl80211_bss_scan_width scan_width);
    1681                 :            : int ieee80211_request_scan(struct ieee80211_sub_if_data *sdata,
    1682                 :            :                            struct cfg80211_scan_request *req);
    1683                 :            : void ieee80211_scan_cancel(struct ieee80211_local *local);
    1684                 :            : void ieee80211_run_deferred_scan(struct ieee80211_local *local);
    1685                 :            : void ieee80211_scan_rx(struct ieee80211_local *local, struct sk_buff *skb);
    1686                 :            : 
    1687                 :            : void ieee80211_mlme_notify_scan_completed(struct ieee80211_local *local);
    1688                 :            : struct ieee80211_bss *
    1689                 :            : ieee80211_bss_info_update(struct ieee80211_local *local,
    1690                 :            :                           struct ieee80211_rx_status *rx_status,
    1691                 :            :                           struct ieee80211_mgmt *mgmt,
    1692                 :            :                           size_t len,
    1693                 :            :                           struct ieee80211_channel *channel);
    1694                 :            : void ieee80211_rx_bss_put(struct ieee80211_local *local,
    1695                 :            :                           struct ieee80211_bss *bss);
    1696                 :            : 
    1697                 :            : /* scheduled scan handling */
    1698                 :            : int
    1699                 :            : __ieee80211_request_sched_scan_start(struct ieee80211_sub_if_data *sdata,
    1700                 :            :                                      struct cfg80211_sched_scan_request *req);
    1701                 :            : int ieee80211_request_sched_scan_start(struct ieee80211_sub_if_data *sdata,
    1702                 :            :                                        struct cfg80211_sched_scan_request *req);
    1703                 :            : int ieee80211_request_sched_scan_stop(struct ieee80211_local *local);
    1704                 :            : void ieee80211_sched_scan_end(struct ieee80211_local *local);
    1705                 :            : void ieee80211_sched_scan_stopped_work(struct work_struct *work);
    1706                 :            : 
    1707                 :            : /* off-channel/mgmt-tx */
    1708                 :            : void ieee80211_offchannel_stop_vifs(struct ieee80211_local *local);
    1709                 :            : void ieee80211_offchannel_return(struct ieee80211_local *local);
    1710                 :            : void ieee80211_roc_setup(struct ieee80211_local *local);
    1711                 :            : void ieee80211_start_next_roc(struct ieee80211_local *local);
    1712                 :            : void ieee80211_roc_purge(struct ieee80211_local *local,
    1713                 :            :                          struct ieee80211_sub_if_data *sdata);
    1714                 :            : int ieee80211_remain_on_channel(struct wiphy *wiphy, struct wireless_dev *wdev,
    1715                 :            :                                 struct ieee80211_channel *chan,
    1716                 :            :                                 unsigned int duration, u64 *cookie);
    1717                 :            : int ieee80211_cancel_remain_on_channel(struct wiphy *wiphy,
    1718                 :            :                                        struct wireless_dev *wdev, u64 cookie);
    1719                 :            : int ieee80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
    1720                 :            :                       struct cfg80211_mgmt_tx_params *params, u64 *cookie);
    1721                 :            : int ieee80211_mgmt_tx_cancel_wait(struct wiphy *wiphy,
    1722                 :            :                                   struct wireless_dev *wdev, u64 cookie);
    1723                 :            : 
    1724                 :            : /* channel switch handling */
    1725                 :            : void ieee80211_csa_finalize_work(struct work_struct *work);
    1726                 :            : int ieee80211_channel_switch(struct wiphy *wiphy, struct net_device *dev,
    1727                 :            :                              struct cfg80211_csa_settings *params);
    1728                 :            : 
    1729                 :            : /* interface handling */
    1730                 :            : int ieee80211_iface_init(void);
    1731                 :            : void ieee80211_iface_exit(void);
    1732                 :            : int ieee80211_if_add(struct ieee80211_local *local, const char *name,
    1733                 :            :                      unsigned char name_assign_type,
    1734                 :            :                      struct wireless_dev **new_wdev, enum nl80211_iftype type,
    1735                 :            :                      struct vif_params *params);
    1736                 :            : int ieee80211_if_change_type(struct ieee80211_sub_if_data *sdata,
    1737                 :            :                              enum nl80211_iftype type);
    1738                 :            : void ieee80211_if_remove(struct ieee80211_sub_if_data *sdata);
    1739                 :            : void ieee80211_remove_interfaces(struct ieee80211_local *local);
    1740                 :            : u32 ieee80211_idle_off(struct ieee80211_local *local);
    1741                 :            : void ieee80211_recalc_idle(struct ieee80211_local *local);
    1742                 :            : void ieee80211_adjust_monitor_flags(struct ieee80211_sub_if_data *sdata,
    1743                 :            :                                     const int offset);
    1744                 :            : int ieee80211_do_open(struct wireless_dev *wdev, bool coming_up);
    1745                 :            : void ieee80211_sdata_stop(struct ieee80211_sub_if_data *sdata);
    1746                 :            : int ieee80211_add_virtual_monitor(struct ieee80211_local *local);
    1747                 :            : void ieee80211_del_virtual_monitor(struct ieee80211_local *local);
    1748                 :            : 
    1749                 :            : bool __ieee80211_recalc_txpower(struct ieee80211_sub_if_data *sdata);
    1750                 :            : void ieee80211_recalc_txpower(struct ieee80211_sub_if_data *sdata,
    1751                 :            :                               bool update_bss);
    1752                 :            : 
    1753                 :          0 : static inline bool ieee80211_sdata_running(struct ieee80211_sub_if_data *sdata)
    1754                 :            : {
    1755                 :          0 :         return test_bit(SDATA_STATE_RUNNING, &sdata->state);
    1756                 :            : }
    1757                 :            : 
    1758                 :            : /* tx handling */
    1759                 :            : void ieee80211_clear_tx_pending(struct ieee80211_local *local);
    1760                 :            : void ieee80211_tx_pending(unsigned long data);
    1761                 :            : netdev_tx_t ieee80211_monitor_start_xmit(struct sk_buff *skb,
    1762                 :            :                                          struct net_device *dev);
    1763                 :            : netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb,
    1764                 :            :                                        struct net_device *dev);
    1765                 :            : void __ieee80211_subif_start_xmit(struct sk_buff *skb,
    1766                 :            :                                   struct net_device *dev,
    1767                 :            :                                   u32 info_flags,
    1768                 :            :                                   u32 ctrl_flags);
    1769                 :            : void ieee80211_purge_tx_queue(struct ieee80211_hw *hw,
    1770                 :            :                               struct sk_buff_head *skbs);
    1771                 :            : struct sk_buff *
    1772                 :            : ieee80211_build_data_template(struct ieee80211_sub_if_data *sdata,
    1773                 :            :                               struct sk_buff *skb, u32 info_flags);
    1774                 :            : void ieee80211_tx_monitor(struct ieee80211_local *local, struct sk_buff *skb,
    1775                 :            :                           struct ieee80211_supported_band *sband,
    1776                 :            :                           int retry_count, int shift, bool send_to_cooked,
    1777                 :            :                           struct ieee80211_tx_status *status);
    1778                 :            : 
    1779                 :            : void ieee80211_check_fast_xmit(struct sta_info *sta);
    1780                 :            : void ieee80211_check_fast_xmit_all(struct ieee80211_local *local);
    1781                 :            : void ieee80211_check_fast_xmit_iface(struct ieee80211_sub_if_data *sdata);
    1782                 :            : void ieee80211_clear_fast_xmit(struct sta_info *sta);
    1783                 :            : int ieee80211_tx_control_port(struct wiphy *wiphy, struct net_device *dev,
    1784                 :            :                               const u8 *buf, size_t len,
    1785                 :            :                               const u8 *dest, __be16 proto, bool unencrypted);
    1786                 :            : int ieee80211_probe_mesh_link(struct wiphy *wiphy, struct net_device *dev,
    1787                 :            :                               const u8 *buf, size_t len);
    1788                 :            : 
    1789                 :            : /* HT */
    1790                 :            : void ieee80211_apply_htcap_overrides(struct ieee80211_sub_if_data *sdata,
    1791                 :            :                                      struct ieee80211_sta_ht_cap *ht_cap);
    1792                 :            : bool ieee80211_ht_cap_ie_to_sta_ht_cap(struct ieee80211_sub_if_data *sdata,
    1793                 :            :                                        struct ieee80211_supported_band *sband,
    1794                 :            :                                        const struct ieee80211_ht_cap *ht_cap_ie,
    1795                 :            :                                        struct sta_info *sta);
    1796                 :            : void ieee80211_send_delba(struct ieee80211_sub_if_data *sdata,
    1797                 :            :                           const u8 *da, u16 tid,
    1798                 :            :                           u16 initiator, u16 reason_code);
    1799                 :            : int ieee80211_send_smps_action(struct ieee80211_sub_if_data *sdata,
    1800                 :            :                                enum ieee80211_smps_mode smps, const u8 *da,
    1801                 :            :                                const u8 *bssid);
    1802                 :            : void ieee80211_request_smps_ap_work(struct work_struct *work);
    1803                 :            : void ieee80211_request_smps_mgd_work(struct work_struct *work);
    1804                 :            : bool ieee80211_smps_is_restrictive(enum ieee80211_smps_mode smps_mode_old,
    1805                 :            :                                    enum ieee80211_smps_mode smps_mode_new);
    1806                 :            : 
    1807                 :            : void ___ieee80211_stop_rx_ba_session(struct sta_info *sta, u16 tid,
    1808                 :            :                                      u16 initiator, u16 reason, bool stop);
    1809                 :            : void __ieee80211_stop_rx_ba_session(struct sta_info *sta, u16 tid,
    1810                 :            :                                     u16 initiator, u16 reason, bool stop);
    1811                 :            : void ___ieee80211_start_rx_ba_session(struct sta_info *sta,
    1812                 :            :                                       u8 dialog_token, u16 timeout,
    1813                 :            :                                       u16 start_seq_num, u16 ba_policy, u16 tid,
    1814                 :            :                                       u16 buf_size, bool tx, bool auto_seq,
    1815                 :            :                                       const struct ieee80211_addba_ext_ie *addbaext);
    1816                 :            : void ieee80211_sta_tear_down_BA_sessions(struct sta_info *sta,
    1817                 :            :                                          enum ieee80211_agg_stop_reason reason);
    1818                 :            : void ieee80211_process_delba(struct ieee80211_sub_if_data *sdata,
    1819                 :            :                              struct sta_info *sta,
    1820                 :            :                              struct ieee80211_mgmt *mgmt, size_t len);
    1821                 :            : void ieee80211_process_addba_resp(struct ieee80211_local *local,
    1822                 :            :                                   struct sta_info *sta,
    1823                 :            :                                   struct ieee80211_mgmt *mgmt,
    1824                 :            :                                   size_t len);
    1825                 :            : void ieee80211_process_addba_request(struct ieee80211_local *local,
    1826                 :            :                                      struct sta_info *sta,
    1827                 :            :                                      struct ieee80211_mgmt *mgmt,
    1828                 :            :                                      size_t len);
    1829                 :            : 
    1830                 :            : int __ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid,
    1831                 :            :                                    enum ieee80211_agg_stop_reason reason);
    1832                 :            : int ___ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid,
    1833                 :            :                                     enum ieee80211_agg_stop_reason reason);
    1834                 :            : void ieee80211_start_tx_ba_cb(struct sta_info *sta, int tid,
    1835                 :            :                               struct tid_ampdu_tx *tid_tx);
    1836                 :            : void ieee80211_stop_tx_ba_cb(struct sta_info *sta, int tid,
    1837                 :            :                              struct tid_ampdu_tx *tid_tx);
    1838                 :            : void ieee80211_ba_session_work(struct work_struct *work);
    1839                 :            : void ieee80211_tx_ba_session_handle_start(struct sta_info *sta, int tid);
    1840                 :            : void ieee80211_release_reorder_timeout(struct sta_info *sta, int tid);
    1841                 :            : 
    1842                 :            : u8 ieee80211_mcs_to_chains(const struct ieee80211_mcs_info *mcs);
    1843                 :            : enum nl80211_smps_mode
    1844                 :            : ieee80211_smps_mode_to_smps_mode(enum ieee80211_smps_mode smps);
    1845                 :            : 
    1846                 :            : /* VHT */
    1847                 :            : void
    1848                 :            : ieee80211_vht_cap_ie_to_sta_vht_cap(struct ieee80211_sub_if_data *sdata,
    1849                 :            :                                     struct ieee80211_supported_band *sband,
    1850                 :            :                                     const struct ieee80211_vht_cap *vht_cap_ie,
    1851                 :            :                                     struct sta_info *sta);
    1852                 :            : enum ieee80211_sta_rx_bandwidth ieee80211_sta_cap_rx_bw(struct sta_info *sta);
    1853                 :            : enum ieee80211_sta_rx_bandwidth ieee80211_sta_cur_vht_bw(struct sta_info *sta);
    1854                 :            : void ieee80211_sta_set_rx_nss(struct sta_info *sta);
    1855                 :            : enum ieee80211_sta_rx_bandwidth
    1856                 :            : ieee80211_chan_width_to_rx_bw(enum nl80211_chan_width width);
    1857                 :            : enum nl80211_chan_width ieee80211_sta_cap_chan_bw(struct sta_info *sta);
    1858                 :            : void ieee80211_sta_set_rx_nss(struct sta_info *sta);
    1859                 :            : void ieee80211_process_mu_groups(struct ieee80211_sub_if_data *sdata,
    1860                 :            :                                  struct ieee80211_mgmt *mgmt);
    1861                 :            : u32 __ieee80211_vht_handle_opmode(struct ieee80211_sub_if_data *sdata,
    1862                 :            :                                   struct sta_info *sta, u8 opmode,
    1863                 :            :                                   enum nl80211_band band);
    1864                 :            : void ieee80211_vht_handle_opmode(struct ieee80211_sub_if_data *sdata,
    1865                 :            :                                  struct sta_info *sta, u8 opmode,
    1866                 :            :                                  enum nl80211_band band);
    1867                 :            : void ieee80211_apply_vhtcap_overrides(struct ieee80211_sub_if_data *sdata,
    1868                 :            :                                       struct ieee80211_sta_vht_cap *vht_cap);
    1869                 :            : void ieee80211_get_vht_mask_from_cap(__le16 vht_cap,
    1870                 :            :                                      u16 vht_mask[NL80211_VHT_NSS_MAX]);
    1871                 :            : enum nl80211_chan_width
    1872                 :            : ieee80211_sta_rx_bw_to_chan_width(struct sta_info *sta);
    1873                 :            : 
    1874                 :            : /* HE */
    1875                 :            : void
    1876                 :            : ieee80211_he_cap_ie_to_sta_he_cap(struct ieee80211_sub_if_data *sdata,
    1877                 :            :                                   struct ieee80211_supported_band *sband,
    1878                 :            :                                   const u8 *he_cap_ie, u8 he_cap_len,
    1879                 :            :                                   struct sta_info *sta);
    1880                 :            : void
    1881                 :            : ieee80211_he_spr_ie_to_bss_conf(struct ieee80211_vif *vif,
    1882                 :            :                                 const struct ieee80211_he_spr *he_spr_ie_elem);
    1883                 :            : 
    1884                 :            : void
    1885                 :            : ieee80211_he_op_ie_to_bss_conf(struct ieee80211_vif *vif,
    1886                 :            :                         const struct ieee80211_he_operation *he_op_ie_elem);
    1887                 :            : 
    1888                 :            : /* Spectrum management */
    1889                 :            : void ieee80211_process_measurement_req(struct ieee80211_sub_if_data *sdata,
    1890                 :            :                                        struct ieee80211_mgmt *mgmt,
    1891                 :            :                                        size_t len);
    1892                 :            : /**
    1893                 :            :  * ieee80211_parse_ch_switch_ie - parses channel switch IEs
    1894                 :            :  * @sdata: the sdata of the interface which has received the frame
    1895                 :            :  * @elems: parsed 802.11 elements received with the frame
    1896                 :            :  * @current_band: indicates the current band
    1897                 :            :  * @sta_flags: contains information about own capabilities and restrictions
    1898                 :            :  *      to decide which channel switch announcements can be accepted. Only the
    1899                 :            :  *      following subset of &enum ieee80211_sta_flags are evaluated:
    1900                 :            :  *      %IEEE80211_STA_DISABLE_HT, %IEEE80211_STA_DISABLE_VHT,
    1901                 :            :  *      %IEEE80211_STA_DISABLE_40MHZ, %IEEE80211_STA_DISABLE_80P80MHZ,
    1902                 :            :  *      %IEEE80211_STA_DISABLE_160MHZ.
    1903                 :            :  * @bssid: the currently connected bssid (for reporting)
    1904                 :            :  * @csa_ie: parsed 802.11 csa elements on count, mode, chandef and mesh ttl.
    1905                 :            :         All of them will be filled with if success only.
    1906                 :            :  * Return: 0 on success, <0 on error and >0 if there is nothing to parse.
    1907                 :            :  */
    1908                 :            : int ieee80211_parse_ch_switch_ie(struct ieee80211_sub_if_data *sdata,
    1909                 :            :                                  struct ieee802_11_elems *elems,
    1910                 :            :                                  enum nl80211_band current_band,
    1911                 :            :                                  u32 sta_flags, u8 *bssid,
    1912                 :            :                                  struct ieee80211_csa_ie *csa_ie);
    1913                 :            : 
    1914                 :            : /* Suspend/resume and hw reconfiguration */
    1915                 :            : int ieee80211_reconfig(struct ieee80211_local *local);
    1916                 :            : void ieee80211_stop_device(struct ieee80211_local *local);
    1917                 :            : 
    1918                 :            : int __ieee80211_suspend(struct ieee80211_hw *hw,
    1919                 :            :                         struct cfg80211_wowlan *wowlan);
    1920                 :            : 
    1921                 :          0 : static inline int __ieee80211_resume(struct ieee80211_hw *hw)
    1922                 :            : {
    1923                 :          0 :         struct ieee80211_local *local = hw_to_local(hw);
    1924                 :            : 
    1925   [ #  #  #  #  :          0 :         WARN(test_bit(SCAN_HW_SCANNING, &local->scanning) &&
             #  #  #  # ]
    1926                 :            :              !test_bit(SCAN_COMPLETED, &local->scanning),
    1927                 :            :                 "%s: resume with hardware scan still in progress\n",
    1928                 :            :                 wiphy_name(hw->wiphy));
    1929                 :            : 
    1930                 :          0 :         return ieee80211_reconfig(hw_to_local(hw));
    1931                 :            : }
    1932                 :            : 
    1933                 :            : /* utility functions/constants */
    1934                 :            : extern const void *const mac80211_wiphy_privid; /* for wiphy privid */
    1935                 :            : int ieee80211_frame_duration(enum nl80211_band band, size_t len,
    1936                 :            :                              int rate, int erp, int short_preamble,
    1937                 :            :                              int shift);
    1938                 :            : void ieee80211_regulatory_limit_wmm_params(struct ieee80211_sub_if_data *sdata,
    1939                 :            :                                            struct ieee80211_tx_queue_params *qparam,
    1940                 :            :                                            int ac);
    1941                 :            : void ieee80211_set_wmm_default(struct ieee80211_sub_if_data *sdata,
    1942                 :            :                                bool bss_notify, bool enable_qos);
    1943                 :            : void ieee80211_xmit(struct ieee80211_sub_if_data *sdata,
    1944                 :            :                     struct sta_info *sta, struct sk_buff *skb,
    1945                 :            :                     u32 txdata_flags);
    1946                 :            : 
    1947                 :            : void __ieee80211_tx_skb_tid_band(struct ieee80211_sub_if_data *sdata,
    1948                 :            :                                  struct sk_buff *skb, int tid,
    1949                 :            :                                  enum nl80211_band band, u32 txdata_flags);
    1950                 :            : 
    1951                 :            : static inline void
    1952                 :          0 : ieee80211_tx_skb_tid_band(struct ieee80211_sub_if_data *sdata,
    1953                 :            :                           struct sk_buff *skb, int tid,
    1954                 :            :                           enum nl80211_band band, u32 txdata_flags)
    1955                 :            : {
    1956                 :          0 :         rcu_read_lock();
    1957                 :          0 :         __ieee80211_tx_skb_tid_band(sdata, skb, tid, band, txdata_flags);
    1958                 :          0 :         rcu_read_unlock();
    1959                 :          0 : }
    1960                 :            : 
    1961                 :          0 : static inline void ieee80211_tx_skb_tid(struct ieee80211_sub_if_data *sdata,
    1962                 :            :                                         struct sk_buff *skb, int tid)
    1963                 :            : {
    1964                 :          0 :         struct ieee80211_chanctx_conf *chanctx_conf;
    1965                 :            : 
    1966                 :          0 :         rcu_read_lock();
    1967         [ #  # ]:          0 :         chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
    1968   [ #  #  #  # ]:          0 :         if (WARN_ON(!chanctx_conf)) {
    1969                 :          0 :                 rcu_read_unlock();
    1970                 :          0 :                 kfree_skb(skb);
    1971                 :          0 :                 return;
    1972                 :            :         }
    1973                 :            : 
    1974                 :          0 :         __ieee80211_tx_skb_tid_band(sdata, skb, tid,
    1975                 :          0 :                                     chanctx_conf->def.chan->band, 0);
    1976                 :          0 :         rcu_read_unlock();
    1977                 :            : }
    1978                 :            : 
    1979                 :          0 : static inline void ieee80211_tx_skb(struct ieee80211_sub_if_data *sdata,
    1980                 :            :                                     struct sk_buff *skb)
    1981                 :            : {
    1982                 :            :         /* Send all internal mgmt frames on VO. Accordingly set TID to 7. */
    1983                 :          0 :         ieee80211_tx_skb_tid(sdata, skb, 7);
    1984                 :          0 : }
    1985                 :            : 
    1986                 :            : u32 ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action,
    1987                 :            :                                struct ieee802_11_elems *elems,
    1988                 :            :                                u64 filter, u32 crc, u8 *transmitter_bssid,
    1989                 :            :                                u8 *bss_bssid);
    1990                 :          0 : static inline void ieee802_11_parse_elems(const u8 *start, size_t len,
    1991                 :            :                                           bool action,
    1992                 :            :                                           struct ieee802_11_elems *elems,
    1993                 :            :                                           u8 *transmitter_bssid,
    1994                 :            :                                           u8 *bss_bssid)
    1995                 :            : {
    1996                 :          0 :         ieee802_11_parse_elems_crc(start, len, action, elems, 0, 0,
    1997                 :            :                                    transmitter_bssid, bss_bssid);
    1998                 :            : }
    1999                 :            : 
    2000                 :            : 
    2001                 :            : extern const int ieee802_1d_to_ac[8];
    2002                 :            : 
    2003                 :          0 : static inline int ieee80211_ac_from_tid(int tid)
    2004                 :            : {
    2005         [ #  # ]:          0 :         return ieee802_1d_to_ac[tid & 7];
    2006                 :            : }
    2007                 :            : 
    2008                 :            : void ieee80211_dynamic_ps_enable_work(struct work_struct *work);
    2009                 :            : void ieee80211_dynamic_ps_disable_work(struct work_struct *work);
    2010                 :            : void ieee80211_dynamic_ps_timer(struct timer_list *t);
    2011                 :            : void ieee80211_send_nullfunc(struct ieee80211_local *local,
    2012                 :            :                              struct ieee80211_sub_if_data *sdata,
    2013                 :            :                              bool powersave);
    2014                 :            : void ieee80211_sta_rx_notify(struct ieee80211_sub_if_data *sdata,
    2015                 :            :                              struct ieee80211_hdr *hdr);
    2016                 :            : void ieee80211_sta_tx_notify(struct ieee80211_sub_if_data *sdata,
    2017                 :            :                              struct ieee80211_hdr *hdr, bool ack, u16 tx_time);
    2018                 :            : 
    2019                 :            : void ieee80211_wake_queues_by_reason(struct ieee80211_hw *hw,
    2020                 :            :                                      unsigned long queues,
    2021                 :            :                                      enum queue_stop_reason reason,
    2022                 :            :                                      bool refcounted);
    2023                 :            : void ieee80211_stop_vif_queues(struct ieee80211_local *local,
    2024                 :            :                                struct ieee80211_sub_if_data *sdata,
    2025                 :            :                                enum queue_stop_reason reason);
    2026                 :            : void ieee80211_wake_vif_queues(struct ieee80211_local *local,
    2027                 :            :                                struct ieee80211_sub_if_data *sdata,
    2028                 :            :                                enum queue_stop_reason reason);
    2029                 :            : void ieee80211_stop_queues_by_reason(struct ieee80211_hw *hw,
    2030                 :            :                                      unsigned long queues,
    2031                 :            :                                      enum queue_stop_reason reason,
    2032                 :            :                                      bool refcounted);
    2033                 :            : void ieee80211_wake_queue_by_reason(struct ieee80211_hw *hw, int queue,
    2034                 :            :                                     enum queue_stop_reason reason,
    2035                 :            :                                     bool refcounted);
    2036                 :            : void ieee80211_stop_queue_by_reason(struct ieee80211_hw *hw, int queue,
    2037                 :            :                                     enum queue_stop_reason reason,
    2038                 :            :                                     bool refcounted);
    2039                 :            : void ieee80211_propagate_queue_wake(struct ieee80211_local *local, int queue);
    2040                 :            : void ieee80211_add_pending_skb(struct ieee80211_local *local,
    2041                 :            :                                struct sk_buff *skb);
    2042                 :            : void ieee80211_add_pending_skbs(struct ieee80211_local *local,
    2043                 :            :                                 struct sk_buff_head *skbs);
    2044                 :            : void ieee80211_flush_queues(struct ieee80211_local *local,
    2045                 :            :                             struct ieee80211_sub_if_data *sdata, bool drop);
    2046                 :            : void __ieee80211_flush_queues(struct ieee80211_local *local,
    2047                 :            :                               struct ieee80211_sub_if_data *sdata,
    2048                 :            :                               unsigned int queues, bool drop);
    2049                 :            : 
    2050                 :          0 : static inline bool ieee80211_can_run_worker(struct ieee80211_local *local)
    2051                 :            : {
    2052                 :            :         /*
    2053                 :            :          * It's unsafe to try to do any work during reconfigure flow.
    2054                 :            :          * When the flow ends the work will be requeued.
    2055                 :            :          */
    2056         [ #  # ]:          0 :         if (local->in_reconfig)
    2057                 :            :                 return false;
    2058                 :            : 
    2059                 :            :         /*
    2060                 :            :          * If quiescing is set, we are racing with __ieee80211_suspend.
    2061                 :            :          * __ieee80211_suspend flushes the workers after setting quiescing,
    2062                 :            :          * and we check quiescing / suspended before enqueing new workers.
    2063                 :            :          * We should abort the worker to avoid the races below.
    2064                 :            :          */
    2065         [ #  # ]:          0 :         if (local->quiescing)
    2066                 :            :                 return false;
    2067                 :            : 
    2068                 :            :         /*
    2069                 :            :          * We might already be suspended if the following scenario occurs:
    2070                 :            :          * __ieee80211_suspend          Control path
    2071                 :            :          *
    2072                 :            :          *                              if (local->quiescing)
    2073                 :            :          *                                      return;
    2074                 :            :          * local->quiescing = true;
    2075                 :            :          * flush_workqueue();
    2076                 :            :          *                              queue_work(...);
    2077                 :            :          * local->suspended = true;
    2078                 :            :          * local->quiescing = false;
    2079                 :            :          *                              worker starts running...
    2080                 :            :          */
    2081         [ #  # ]:          0 :         if (local->suspended)
    2082                 :            :                 return false;
    2083                 :            : 
    2084                 :            :         return true;
    2085                 :            : }
    2086                 :            : 
    2087                 :            : int ieee80211_txq_setup_flows(struct ieee80211_local *local);
    2088                 :            : void ieee80211_txq_set_params(struct ieee80211_local *local);
    2089                 :            : void ieee80211_txq_teardown_flows(struct ieee80211_local *local);
    2090                 :            : void ieee80211_txq_init(struct ieee80211_sub_if_data *sdata,
    2091                 :            :                         struct sta_info *sta,
    2092                 :            :                         struct txq_info *txq, int tid);
    2093                 :            : void ieee80211_txq_purge(struct ieee80211_local *local,
    2094                 :            :                          struct txq_info *txqi);
    2095                 :            : void ieee80211_txq_remove_vlan(struct ieee80211_local *local,
    2096                 :            :                                struct ieee80211_sub_if_data *sdata);
    2097                 :            : void ieee80211_fill_txq_stats(struct cfg80211_txq_stats *txqstats,
    2098                 :            :                               struct txq_info *txqi);
    2099                 :            : void ieee80211_wake_txqs(unsigned long data);
    2100                 :            : void ieee80211_send_auth(struct ieee80211_sub_if_data *sdata,
    2101                 :            :                          u16 transaction, u16 auth_alg, u16 status,
    2102                 :            :                          const u8 *extra, size_t extra_len, const u8 *bssid,
    2103                 :            :                          const u8 *da, const u8 *key, u8 key_len, u8 key_idx,
    2104                 :            :                          u32 tx_flags);
    2105                 :            : void ieee80211_send_deauth_disassoc(struct ieee80211_sub_if_data *sdata,
    2106                 :            :                                     const u8 *da, const u8 *bssid,
    2107                 :            :                                     u16 stype, u16 reason,
    2108                 :            :                                     bool send_frame, u8 *frame_buf);
    2109                 :            : 
    2110                 :            : enum {
    2111                 :            :         IEEE80211_PROBE_FLAG_DIRECTED           = BIT(0),
    2112                 :            :         IEEE80211_PROBE_FLAG_MIN_CONTENT        = BIT(1),
    2113                 :            :         IEEE80211_PROBE_FLAG_RANDOM_SN          = BIT(2),
    2114                 :            : };
    2115                 :            : 
    2116                 :            : int ieee80211_build_preq_ies(struct ieee80211_local *local, u8 *buffer,
    2117                 :            :                              size_t buffer_len,
    2118                 :            :                              struct ieee80211_scan_ies *ie_desc,
    2119                 :            :                              const u8 *ie, size_t ie_len,
    2120                 :            :                              u8 bands_used, u32 *rate_masks,
    2121                 :            :                              struct cfg80211_chan_def *chandef,
    2122                 :            :                              u32 flags);
    2123                 :            : struct sk_buff *ieee80211_build_probe_req(struct ieee80211_sub_if_data *sdata,
    2124                 :            :                                           const u8 *src, const u8 *dst,
    2125                 :            :                                           u32 ratemask,
    2126                 :            :                                           struct ieee80211_channel *chan,
    2127                 :            :                                           const u8 *ssid, size_t ssid_len,
    2128                 :            :                                           const u8 *ie, size_t ie_len,
    2129                 :            :                                           u32 flags);
    2130                 :            : u32 ieee80211_sta_get_rates(struct ieee80211_sub_if_data *sdata,
    2131                 :            :                             struct ieee802_11_elems *elems,
    2132                 :            :                             enum nl80211_band band, u32 *basic_rates);
    2133                 :            : int __ieee80211_request_smps_mgd(struct ieee80211_sub_if_data *sdata,
    2134                 :            :                                  enum ieee80211_smps_mode smps_mode);
    2135                 :            : int __ieee80211_request_smps_ap(struct ieee80211_sub_if_data *sdata,
    2136                 :            :                                 enum ieee80211_smps_mode smps_mode);
    2137                 :            : void ieee80211_recalc_smps(struct ieee80211_sub_if_data *sdata);
    2138                 :            : void ieee80211_recalc_min_chandef(struct ieee80211_sub_if_data *sdata);
    2139                 :            : 
    2140                 :            : size_t ieee80211_ie_split_vendor(const u8 *ies, size_t ielen, size_t offset);
    2141                 :            : u8 *ieee80211_ie_build_ht_cap(u8 *pos, struct ieee80211_sta_ht_cap *ht_cap,
    2142                 :            :                               u16 cap);
    2143                 :            : u8 *ieee80211_ie_build_ht_oper(u8 *pos, struct ieee80211_sta_ht_cap *ht_cap,
    2144                 :            :                                const struct cfg80211_chan_def *chandef,
    2145                 :            :                                u16 prot_mode, bool rifs_mode);
    2146                 :            : void ieee80211_ie_build_wide_bw_cs(u8 *pos,
    2147                 :            :                                    const struct cfg80211_chan_def *chandef);
    2148                 :            : u8 *ieee80211_ie_build_vht_cap(u8 *pos, struct ieee80211_sta_vht_cap *vht_cap,
    2149                 :            :                                u32 cap);
    2150                 :            : u8 *ieee80211_ie_build_vht_oper(u8 *pos, struct ieee80211_sta_vht_cap *vht_cap,
    2151                 :            :                                 const struct cfg80211_chan_def *chandef);
    2152                 :            : u8 ieee80211_ie_len_he_cap(struct ieee80211_sub_if_data *sdata, u8 iftype);
    2153                 :            : u8 *ieee80211_ie_build_he_cap(u8 *pos,
    2154                 :            :                               const struct ieee80211_sta_he_cap *he_cap,
    2155                 :            :                               u8 *end);
    2156                 :            : u8 *ieee80211_ie_build_he_oper(u8 *pos);
    2157                 :            : int ieee80211_parse_bitrates(struct cfg80211_chan_def *chandef,
    2158                 :            :                              const struct ieee80211_supported_band *sband,
    2159                 :            :                              const u8 *srates, int srates_len, u32 *rates);
    2160                 :            : int ieee80211_add_srates_ie(struct ieee80211_sub_if_data *sdata,
    2161                 :            :                             struct sk_buff *skb, bool need_basic,
    2162                 :            :                             enum nl80211_band band);
    2163                 :            : int ieee80211_add_ext_srates_ie(struct ieee80211_sub_if_data *sdata,
    2164                 :            :                                 struct sk_buff *skb, bool need_basic,
    2165                 :            :                                 enum nl80211_band band);
    2166                 :            : u8 *ieee80211_add_wmm_info_ie(u8 *buf, u8 qosinfo);
    2167                 :            : 
    2168                 :            : /* channel management */
    2169                 :            : bool ieee80211_chandef_ht_oper(const struct ieee80211_ht_operation *ht_oper,
    2170                 :            :                                struct cfg80211_chan_def *chandef);
    2171                 :            : bool ieee80211_chandef_vht_oper(struct ieee80211_hw *hw,
    2172                 :            :                                 const struct ieee80211_vht_operation *oper,
    2173                 :            :                                 const struct ieee80211_ht_operation *htop,
    2174                 :            :                                 struct cfg80211_chan_def *chandef);
    2175                 :            : u32 ieee80211_chandef_downgrade(struct cfg80211_chan_def *c);
    2176                 :            : 
    2177                 :            : int __must_check
    2178                 :            : ieee80211_vif_use_channel(struct ieee80211_sub_if_data *sdata,
    2179                 :            :                           const struct cfg80211_chan_def *chandef,
    2180                 :            :                           enum ieee80211_chanctx_mode mode);
    2181                 :            : int __must_check
    2182                 :            : ieee80211_vif_reserve_chanctx(struct ieee80211_sub_if_data *sdata,
    2183                 :            :                               const struct cfg80211_chan_def *chandef,
    2184                 :            :                               enum ieee80211_chanctx_mode mode,
    2185                 :            :                               bool radar_required);
    2186                 :            : int __must_check
    2187                 :            : ieee80211_vif_use_reserved_context(struct ieee80211_sub_if_data *sdata);
    2188                 :            : int ieee80211_vif_unreserve_chanctx(struct ieee80211_sub_if_data *sdata);
    2189                 :            : 
    2190                 :            : int __must_check
    2191                 :            : ieee80211_vif_change_bandwidth(struct ieee80211_sub_if_data *sdata,
    2192                 :            :                                const struct cfg80211_chan_def *chandef,
    2193                 :            :                                u32 *changed);
    2194                 :            : void ieee80211_vif_release_channel(struct ieee80211_sub_if_data *sdata);
    2195                 :            : void ieee80211_vif_vlan_copy_chanctx(struct ieee80211_sub_if_data *sdata);
    2196                 :            : void ieee80211_vif_copy_chanctx_to_vlans(struct ieee80211_sub_if_data *sdata,
    2197                 :            :                                          bool clear);
    2198                 :            : int ieee80211_chanctx_refcount(struct ieee80211_local *local,
    2199                 :            :                                struct ieee80211_chanctx *ctx);
    2200                 :            : 
    2201                 :            : void ieee80211_recalc_smps_chanctx(struct ieee80211_local *local,
    2202                 :            :                                    struct ieee80211_chanctx *chanctx);
    2203                 :            : void ieee80211_recalc_chanctx_min_def(struct ieee80211_local *local,
    2204                 :            :                                       struct ieee80211_chanctx *ctx);
    2205                 :            : bool ieee80211_is_radar_required(struct ieee80211_local *local);
    2206                 :            : 
    2207                 :            : void ieee80211_dfs_cac_timer(unsigned long data);
    2208                 :            : void ieee80211_dfs_cac_timer_work(struct work_struct *work);
    2209                 :            : void ieee80211_dfs_cac_cancel(struct ieee80211_local *local);
    2210                 :            : void ieee80211_dfs_radar_detected_work(struct work_struct *work);
    2211                 :            : int ieee80211_send_action_csa(struct ieee80211_sub_if_data *sdata,
    2212                 :            :                               struct cfg80211_csa_settings *csa_settings);
    2213                 :            : 
    2214                 :            : bool ieee80211_cs_valid(const struct ieee80211_cipher_scheme *cs);
    2215                 :            : bool ieee80211_cs_list_valid(const struct ieee80211_cipher_scheme *cs, int n);
    2216                 :            : const struct ieee80211_cipher_scheme *
    2217                 :            : ieee80211_cs_get(struct ieee80211_local *local, u32 cipher,
    2218                 :            :                  enum nl80211_iftype iftype);
    2219                 :            : int ieee80211_cs_headroom(struct ieee80211_local *local,
    2220                 :            :                           struct cfg80211_crypto_settings *crypto,
    2221                 :            :                           enum nl80211_iftype iftype);
    2222                 :            : void ieee80211_recalc_dtim(struct ieee80211_local *local,
    2223                 :            :                            struct ieee80211_sub_if_data *sdata);
    2224                 :            : int ieee80211_check_combinations(struct ieee80211_sub_if_data *sdata,
    2225                 :            :                                  const struct cfg80211_chan_def *chandef,
    2226                 :            :                                  enum ieee80211_chanctx_mode chanmode,
    2227                 :            :                                  u8 radar_detect);
    2228                 :            : int ieee80211_max_num_channels(struct ieee80211_local *local);
    2229                 :            : enum nl80211_chan_width ieee80211_get_sta_bw(struct ieee80211_sta *sta);
    2230                 :            : void ieee80211_recalc_chanctx_chantype(struct ieee80211_local *local,
    2231                 :            :                                        struct ieee80211_chanctx *ctx);
    2232                 :            : 
    2233                 :            : /* TDLS */
    2234                 :            : int ieee80211_tdls_mgmt(struct wiphy *wiphy, struct net_device *dev,
    2235                 :            :                         const u8 *peer, u8 action_code, u8 dialog_token,
    2236                 :            :                         u16 status_code, u32 peer_capability,
    2237                 :            :                         bool initiator, const u8 *extra_ies,
    2238                 :            :                         size_t extra_ies_len);
    2239                 :            : int ieee80211_tdls_oper(struct wiphy *wiphy, struct net_device *dev,
    2240                 :            :                         const u8 *peer, enum nl80211_tdls_operation oper);
    2241                 :            : void ieee80211_tdls_peer_del_work(struct work_struct *wk);
    2242                 :            : int ieee80211_tdls_channel_switch(struct wiphy *wiphy, struct net_device *dev,
    2243                 :            :                                   const u8 *addr, u8 oper_class,
    2244                 :            :                                   struct cfg80211_chan_def *chandef);
    2245                 :            : void ieee80211_tdls_cancel_channel_switch(struct wiphy *wiphy,
    2246                 :            :                                           struct net_device *dev,
    2247                 :            :                                           const u8 *addr);
    2248                 :            : void ieee80211_teardown_tdls_peers(struct ieee80211_sub_if_data *sdata);
    2249                 :            : void ieee80211_tdls_chsw_work(struct work_struct *wk);
    2250                 :            : void ieee80211_tdls_handle_disconnect(struct ieee80211_sub_if_data *sdata,
    2251                 :            :                                       const u8 *peer, u16 reason);
    2252                 :            : const char *ieee80211_get_reason_code_string(u16 reason_code);
    2253                 :            : 
    2254                 :            : extern const struct ethtool_ops ieee80211_ethtool_ops;
    2255                 :            : 
    2256                 :            : u32 ieee80211_calc_expected_tx_airtime(struct ieee80211_hw *hw,
    2257                 :            :                                        struct ieee80211_vif *vif,
    2258                 :            :                                        struct ieee80211_sta *pubsta,
    2259                 :            :                                        int len);
    2260                 :            : #ifdef CONFIG_MAC80211_NOINLINE
    2261                 :            : #define debug_noinline noinline
    2262                 :            : #else
    2263                 :            : #define debug_noinline
    2264                 :            : #endif
    2265                 :            : 
    2266                 :            : #endif /* IEEE80211_I_H */

Generated by: LCOV version 1.14