1f0706e82SJiri Benc /* 2f0706e82SJiri Benc * Copyright 2002-2005, Instant802 Networks, Inc. 3f0706e82SJiri Benc * Copyright 2005, Devicescape Software, Inc. 4f0706e82SJiri Benc * Copyright 2006-2007 Jiri Benc <jbenc@suse.cz> 5026331c4SJouni Malinen * Copyright 2007-2010 Johannes Berg <johannes@sipsolutions.net> 6f0706e82SJiri Benc * 7f0706e82SJiri Benc * This program is free software; you can redistribute it and/or modify 8f0706e82SJiri Benc * it under the terms of the GNU General Public License version 2 as 9f0706e82SJiri Benc * published by the Free Software Foundation. 10f0706e82SJiri Benc */ 11f0706e82SJiri Benc 12f0706e82SJiri Benc #ifndef IEEE80211_I_H 13f0706e82SJiri Benc #define IEEE80211_I_H 14f0706e82SJiri Benc 15f0706e82SJiri Benc #include <linux/kernel.h> 16f0706e82SJiri Benc #include <linux/device.h> 17f0706e82SJiri Benc #include <linux/if_ether.h> 18f0706e82SJiri Benc #include <linux/interrupt.h> 19f0706e82SJiri Benc #include <linux/list.h> 20f0706e82SJiri Benc #include <linux/netdevice.h> 21f0706e82SJiri Benc #include <linux/skbuff.h> 22f0706e82SJiri Benc #include <linux/workqueue.h> 23f0706e82SJiri Benc #include <linux/types.h> 24f0706e82SJiri Benc #include <linux/spinlock.h> 25571ecf67SJohannes Berg #include <linux/etherdevice.h> 26e1e54068SJohannes Berg #include <linux/leds.h> 27a729cff8SJohannes Berg #include <linux/idr.h> 28fe7a5d5cSJohannes Berg #include <net/ieee80211_radiotap.h> 2993da9cc1Scolin@cozybit.com #include <net/cfg80211.h> 3051cb6db0SDavid S. Miller #include <net/mac80211.h> 312c8dccc7SJohannes Berg #include "key.h" 32f0706e82SJiri Benc #include "sta_info.h" 33f0706e82SJiri Benc 349cfb0009SJohannes Berg struct ieee80211_local; 35f0706e82SJiri Benc 36f0706e82SJiri Benc /* Maximum number of broadcast/multicast frames to buffer when some of the 37f0706e82SJiri Benc * associated stations are using power saving. */ 38f0706e82SJiri Benc #define AP_MAX_BC_BUFFER 128 39f0706e82SJiri Benc 40f0706e82SJiri Benc /* Maximum number of frames buffered to all STAs, including multicast frames. 41f0706e82SJiri Benc * Note: increasing this limit increases the potential memory requirement. Each 42f0706e82SJiri Benc * frame can be up to about 2 kB long. */ 43f0706e82SJiri Benc #define TOTAL_MAX_TX_BUFFER 512 44f0706e82SJiri Benc 45f0706e82SJiri Benc /* Required encryption head and tailroom */ 46f0706e82SJiri Benc #define IEEE80211_ENCRYPT_HEADROOM 8 47765cb46aSJouni Malinen #define IEEE80211_ENCRYPT_TAILROOM 18 48f0706e82SJiri Benc 49f0706e82SJiri Benc /* IEEE 802.11 (Ch. 9.5 Defragmentation) requires support for concurrent 50f0706e82SJiri Benc * reception of at least three fragmented frames. This limit can be increased 51f0706e82SJiri Benc * by changing this define, at the cost of slower frame reassembly and 52f0706e82SJiri Benc * increased memory use (about 2 kB of RAM per entry). */ 53f0706e82SJiri Benc #define IEEE80211_FRAGMENT_MAX 4 54f0706e82SJiri Benc 5520ad19d0SJohannes Berg #define TU_TO_EXP_TIME(x) (jiffies + usecs_to_jiffies((x) * 1024)) 5620ad19d0SJohannes Berg 57ab13315aSKalle Valo #define IEEE80211_DEFAULT_UAPSD_QUEUES \ 58ab13315aSKalle Valo (IEEE80211_WMM_IE_STA_QOSINFO_AC_BK | \ 59ab13315aSKalle Valo IEEE80211_WMM_IE_STA_QOSINFO_AC_BE | \ 60ab13315aSKalle Valo IEEE80211_WMM_IE_STA_QOSINFO_AC_VI | \ 61ab13315aSKalle Valo IEEE80211_WMM_IE_STA_QOSINFO_AC_VO) 62ab13315aSKalle Valo 63ab13315aSKalle Valo #define IEEE80211_DEFAULT_MAX_SP_LEN \ 64ab13315aSKalle Valo IEEE80211_WMM_IE_STA_QOSINFO_SP_ALL 65ab13315aSKalle Valo 66f0706e82SJiri Benc struct ieee80211_fragment_entry { 67f0706e82SJiri Benc unsigned long first_frag_time; 68f0706e82SJiri Benc unsigned int seq; 69f0706e82SJiri Benc unsigned int rx_queue; 70f0706e82SJiri Benc unsigned int last_frag; 71f0706e82SJiri Benc unsigned int extra_len; 72f0706e82SJiri Benc struct sk_buff_head skb_list; 73f0706e82SJiri Benc int ccmp; /* Whether fragments were encrypted with CCMP */ 74f0706e82SJiri Benc u8 last_pn[6]; /* PN of the last fragment if CCMP was used */ 75f0706e82SJiri Benc }; 76f0706e82SJiri Benc 77f0706e82SJiri Benc 78c2b13452SJohannes Berg struct ieee80211_bss { 7900d3f14cSJohannes Berg /* don't want to look up all the time */ 80056cdd59SJohannes Berg size_t ssid_len; 81f0706e82SJiri Benc u8 ssid[IEEE80211_MAX_SSID_LEN]; 8200d3f14cSJohannes Berg 8398f7dfd8SEmmanuel Grumbach u8 dtim_period; 8400d3f14cSJohannes Berg 8543ac2ca3SJouni Malinen bool wmm_used; 86ab13315aSKalle Valo bool uapsd_supported; 8700d3f14cSJohannes Berg 8800d3f14cSJohannes Berg unsigned long last_probe_resp; 8900d3f14cSJohannes Berg 90ee385855SLuis Carlos Cobo #ifdef CONFIG_MAC80211_MESH 91ee385855SLuis Carlos Cobo u8 *mesh_id; 92ee385855SLuis Carlos Cobo size_t mesh_id_len; 9324736701SJohn W. Linville u8 *mesh_cfg; 94902acc78SJohannes Berg #endif 9500d3f14cSJohannes Berg 96f0706e82SJiri Benc #define IEEE80211_MAX_SUPP_RATES 32 97f0706e82SJiri Benc u8 supp_rates[IEEE80211_MAX_SUPP_RATES]; 98f0706e82SJiri Benc size_t supp_rates_len; 99f0706e82SJiri Benc 10000d3f14cSJohannes Berg /* 10125985edcSLucas De Marchi * During association, we save an ERP value from a probe response so 1025628221cSDaniel Drake * that we can feed ERP info to the driver when handling the 1035628221cSDaniel Drake * association completes. these fields probably won't be up-to-date 10400d3f14cSJohannes Berg * otherwise, you probably don't want to use them. 10500d3f14cSJohannes Berg */ 10600d3f14cSJohannes Berg bool has_erp_value; 1075628221cSDaniel Drake u8 erp_value; 108f0706e82SJiri Benc }; 109f0706e82SJiri Benc 110c2b13452SJohannes Berg static inline u8 *bss_mesh_cfg(struct ieee80211_bss *bss) 111902acc78SJohannes Berg { 112902acc78SJohannes Berg #ifdef CONFIG_MAC80211_MESH 113902acc78SJohannes Berg return bss->mesh_cfg; 114902acc78SJohannes Berg #endif 115902acc78SJohannes Berg return NULL; 116902acc78SJohannes Berg } 117902acc78SJohannes Berg 118c2b13452SJohannes Berg static inline u8 *bss_mesh_id(struct ieee80211_bss *bss) 119902acc78SJohannes Berg { 120902acc78SJohannes Berg #ifdef CONFIG_MAC80211_MESH 121902acc78SJohannes Berg return bss->mesh_id; 122902acc78SJohannes Berg #endif 123902acc78SJohannes Berg return NULL; 124902acc78SJohannes Berg } 125902acc78SJohannes Berg 126c2b13452SJohannes Berg static inline u8 bss_mesh_id_len(struct ieee80211_bss *bss) 127902acc78SJohannes Berg { 128902acc78SJohannes Berg #ifdef CONFIG_MAC80211_MESH 129902acc78SJohannes Berg return bss->mesh_id_len; 130902acc78SJohannes Berg #endif 131902acc78SJohannes Berg return 0; 132902acc78SJohannes Berg } 133902acc78SJohannes Berg 134f0706e82SJiri Benc 1359ae54c84SJohannes Berg typedef unsigned __bitwise__ ieee80211_tx_result; 1369ae54c84SJohannes Berg #define TX_CONTINUE ((__force ieee80211_tx_result) 0u) 1379ae54c84SJohannes Berg #define TX_DROP ((__force ieee80211_tx_result) 1u) 1389ae54c84SJohannes Berg #define TX_QUEUED ((__force ieee80211_tx_result) 2u) 1399ae54c84SJohannes Berg 1405cf121c3SJohannes Berg #define IEEE80211_TX_UNICAST BIT(1) 1415cf121c3SJohannes Berg #define IEEE80211_TX_PS_BUFFERED BIT(2) 1429ae54c84SJohannes Berg 1435cf121c3SJohannes Berg struct ieee80211_tx_data { 144f0706e82SJiri Benc struct sk_buff *skb; 145252b86c4SJohannes Berg struct sk_buff_head skbs; 146f0706e82SJiri Benc struct ieee80211_local *local; 147f0706e82SJiri Benc struct ieee80211_sub_if_data *sdata; 148f0706e82SJiri Benc struct sta_info *sta; 149f0706e82SJiri Benc struct ieee80211_key *key; 1505cf121c3SJohannes Berg 1518318d78aSJohannes Berg struct ieee80211_channel *channel; 152f0706e82SJiri Benc 153056cdd59SJohannes Berg unsigned int flags; 1545cf121c3SJohannes Berg }; 1555cf121c3SJohannes Berg 1565cf121c3SJohannes Berg 1575cf121c3SJohannes Berg typedef unsigned __bitwise__ ieee80211_rx_result; 1585cf121c3SJohannes Berg #define RX_CONTINUE ((__force ieee80211_rx_result) 0u) 1595cf121c3SJohannes Berg #define RX_DROP_UNUSABLE ((__force ieee80211_rx_result) 1u) 1605cf121c3SJohannes Berg #define RX_DROP_MONITOR ((__force ieee80211_rx_result) 2u) 1615cf121c3SJohannes Berg #define RX_QUEUED ((__force ieee80211_rx_result) 3u) 1625cf121c3SJohannes Berg 163554891e6SJohannes Berg /** 164554891e6SJohannes Berg * enum ieee80211_packet_rx_flags - packet RX flags 165554891e6SJohannes Berg * @IEEE80211_RX_RA_MATCH: frame is destined to interface currently processed 166554891e6SJohannes Berg * (incl. multicast frames) 167554891e6SJohannes Berg * @IEEE80211_RX_IN_SCAN: received while scanning 168554891e6SJohannes Berg * @IEEE80211_RX_FRAGMENTED: fragmented frame 169554891e6SJohannes Berg * @IEEE80211_RX_AMSDU: a-MSDU packet 170554891e6SJohannes Berg * @IEEE80211_RX_MALFORMED_ACTION_FRM: action frame is malformed 1714cfda47bSChristian Lamparter * @IEEE80211_RX_DEFERRED_RELEASE: frame was subjected to receive reordering 172554891e6SJohannes Berg * 173554891e6SJohannes Berg * These are per-frame flags that are attached to a frame in the 174554891e6SJohannes Berg * @rx_flags field of &struct ieee80211_rx_status. 175554891e6SJohannes Berg */ 176554891e6SJohannes Berg enum ieee80211_packet_rx_flags { 177554891e6SJohannes Berg IEEE80211_RX_IN_SCAN = BIT(0), 178554891e6SJohannes Berg IEEE80211_RX_RA_MATCH = BIT(1), 179554891e6SJohannes Berg IEEE80211_RX_FRAGMENTED = BIT(2), 180554891e6SJohannes Berg IEEE80211_RX_AMSDU = BIT(3), 181554891e6SJohannes Berg IEEE80211_RX_MALFORMED_ACTION_FRM = BIT(4), 1824cfda47bSChristian Lamparter IEEE80211_RX_DEFERRED_RELEASE = BIT(5), 183554891e6SJohannes Berg }; 184554891e6SJohannes Berg 185554891e6SJohannes Berg /** 186554891e6SJohannes Berg * enum ieee80211_rx_flags - RX data flags 187554891e6SJohannes Berg * 188554891e6SJohannes Berg * @IEEE80211_RX_CMNTR: received on cooked monitor already 189ee971924SJohannes Berg * @IEEE80211_RX_BEACON_REPORTED: This frame was already reported 190ee971924SJohannes Berg * to cfg80211_report_obss_beacon(). 191554891e6SJohannes Berg * 192554891e6SJohannes Berg * These flags are used across handling multiple interfaces 193554891e6SJohannes Berg * for a single frame. 194554891e6SJohannes Berg */ 195554891e6SJohannes Berg enum ieee80211_rx_flags { 196554891e6SJohannes Berg IEEE80211_RX_CMNTR = BIT(0), 197ee971924SJohannes Berg IEEE80211_RX_BEACON_REPORTED = BIT(1), 198554891e6SJohannes Berg }; 1995cf121c3SJohannes Berg 2005cf121c3SJohannes Berg struct ieee80211_rx_data { 2015cf121c3SJohannes Berg struct sk_buff *skb; 2025cf121c3SJohannes Berg struct ieee80211_local *local; 2035cf121c3SJohannes Berg struct ieee80211_sub_if_data *sdata; 2045cf121c3SJohannes Berg struct sta_info *sta; 2055cf121c3SJohannes Berg struct ieee80211_key *key; 206056cdd59SJohannes Berg 207056cdd59SJohannes Berg unsigned int flags; 2089e26297aSJohannes Berg 2099e26297aSJohannes Berg /* 2109e26297aSJohannes Berg * Index into sequence numbers array, 0..16 2119e26297aSJohannes Berg * since the last (16) is used for non-QoS, 2129e26297aSJohannes Berg * will be 16 on non-QoS frames. 2139e26297aSJohannes Berg */ 2149e26297aSJohannes Berg int seqno_idx; 2159e26297aSJohannes Berg 2169e26297aSJohannes Berg /* 2179e26297aSJohannes Berg * Index into the security IV/PN arrays, 0..16 2189e26297aSJohannes Berg * since the last (16) is used for CCMP-encrypted 2199e26297aSJohannes Berg * management frames, will be set to 16 on mgmt 2209e26297aSJohannes Berg * frames and 0 on non-QoS frames. 2219e26297aSJohannes Berg */ 2229e26297aSJohannes Berg int security_idx; 2239e26297aSJohannes Berg 22450741ae0SJohannes Berg u32 tkip_iv32; 22550741ae0SJohannes Berg u16 tkip_iv16; 226f0706e82SJiri Benc }; 227f0706e82SJiri Benc 2285dfdaf58SJohannes Berg struct beacon_data { 2295dfdaf58SJohannes Berg u8 *head, *tail; 2305dfdaf58SJohannes Berg int head_len, tail_len; 2318860020eSJohannes Berg struct rcu_head rcu_head; 2325dfdaf58SJohannes Berg }; 2335dfdaf58SJohannes Berg 234f0706e82SJiri Benc struct ieee80211_if_ap { 23540b275b6SJohannes Berg struct beacon_data __rcu *beacon; 23602945821SArik Nemtsov struct sk_buff __rcu *probe_resp; 237f0706e82SJiri Benc 2380ec3ca44SJohannes Berg struct list_head vlans; 2390ec3ca44SJohannes Berg 240f0706e82SJiri Benc /* yes, this looks ugly, but guarantees that we can later use 241f0706e82SJiri Benc * bitmap_empty :) 242004c872eSJohannes Berg * NB: don't touch this bitmap, use sta_info_{set,clear}_tim_bit */ 243f0706e82SJiri Benc u8 tim[sizeof(unsigned long) * BITS_TO_LONGS(IEEE80211_MAX_AID + 1)]; 244f0706e82SJiri Benc struct sk_buff_head ps_bc_buf; 245056cdd59SJohannes Berg atomic_t num_sta_ps; /* number of stations in PS mode */ 24629623892SJohannes Berg atomic_t num_sta_authorized; /* number of authorized stations */ 2475dfdaf58SJohannes Berg int dtim_count; 248512119b3SChristian Lamparter bool dtim_bc_mc; 249f0706e82SJiri Benc }; 250f0706e82SJiri Benc 251f0706e82SJiri Benc struct ieee80211_if_wds { 252f0706e82SJiri Benc struct sta_info *sta; 253056cdd59SJohannes Berg u8 remote_addr[ETH_ALEN]; 254f0706e82SJiri Benc }; 255f0706e82SJiri Benc 256f0706e82SJiri Benc struct ieee80211_if_vlan { 2570ec3ca44SJohannes Berg struct list_head list; 258f14543eeSFelix Fietkau 259f14543eeSFelix Fietkau /* used for all tx if the VLAN is configured to 4-addr mode */ 26040b275b6SJohannes Berg struct sta_info __rcu *sta; 261f0706e82SJiri Benc }; 262f0706e82SJiri Benc 263ee385855SLuis Carlos Cobo struct mesh_stats { 264c8a61a7dSDaniel Walker __u32 fwded_mcast; /* Mesh forwarded multicast frames */ 265c8a61a7dSDaniel Walker __u32 fwded_unicast; /* Mesh forwarded unicast frames */ 266c8a61a7dSDaniel Walker __u32 fwded_frames; /* Mesh total forwarded frames */ 267ee385855SLuis Carlos Cobo __u32 dropped_frames_ttl; /* Not transmitted since mesh_ttl == 0*/ 268ee385855SLuis Carlos Cobo __u32 dropped_frames_no_route; /* Not transmitted, no route found */ 269cfee66b0SJavier Cardona __u32 dropped_frames_congestion;/* Not forwarded due to congestion */ 270ee385855SLuis Carlos Cobo atomic_t estab_plinks; 271ee385855SLuis Carlos Cobo }; 272ee385855SLuis Carlos Cobo 273ee385855SLuis Carlos Cobo #define PREQ_Q_F_START 0x1 274ee385855SLuis Carlos Cobo #define PREQ_Q_F_REFRESH 0x2 275ee385855SLuis Carlos Cobo struct mesh_preq_queue { 276ee385855SLuis Carlos Cobo struct list_head list; 277ee385855SLuis Carlos Cobo u8 dst[ETH_ALEN]; 278ee385855SLuis Carlos Cobo u8 flags; 279ee385855SLuis Carlos Cobo }; 280ee385855SLuis Carlos Cobo 281f679f65dSJohannes Berg enum ieee80211_work_type { 282b8bc4b0aSJohannes Berg IEEE80211_WORK_ABORT, 283b8bc4b0aSJohannes Berg IEEE80211_WORK_REMAIN_ON_CHANNEL, 284f30221e4SJohannes Berg IEEE80211_WORK_OFFCHANNEL_TX, 28577fdaa12SJohannes Berg }; 28677fdaa12SJohannes Berg 287af6b6374SJohannes Berg /** 288af6b6374SJohannes Berg * enum work_done_result - indicates what to do after work was done 289af6b6374SJohannes Berg * 290af6b6374SJohannes Berg * @WORK_DONE_DESTROY: This work item is no longer needed, destroy. 291af6b6374SJohannes Berg * @WORK_DONE_REQUEUE: This work item was reset to be reused, and 292af6b6374SJohannes Berg * should be requeued. 293af6b6374SJohannes Berg */ 294af6b6374SJohannes Berg enum work_done_result { 295af6b6374SJohannes Berg WORK_DONE_DESTROY, 296af6b6374SJohannes Berg WORK_DONE_REQUEUE, 297af6b6374SJohannes Berg }; 298af6b6374SJohannes Berg 299f679f65dSJohannes Berg struct ieee80211_work { 30077fdaa12SJohannes Berg struct list_head list; 301f679f65dSJohannes Berg 302af6b6374SJohannes Berg struct rcu_head rcu_head; 303af6b6374SJohannes Berg 304af6b6374SJohannes Berg struct ieee80211_sub_if_data *sdata; 305af6b6374SJohannes Berg 306af6b6374SJohannes Berg enum work_done_result (*done)(struct ieee80211_work *wk, 307af6b6374SJohannes Berg struct sk_buff *skb); 308af6b6374SJohannes Berg 309f679f65dSJohannes Berg struct ieee80211_channel *chan; 310e4da8c37SJohannes Berg enum nl80211_channel_type chan_type; 311af6b6374SJohannes Berg 312f679f65dSJohannes Berg unsigned long timeout; 313f679f65dSJohannes Berg enum ieee80211_work_type type; 314f679f65dSJohannes Berg 315e4da8c37SJohannes Berg bool started; 316e4da8c37SJohannes Berg 317f679f65dSJohannes Berg union { 318f679f65dSJohannes Berg struct { 319e4da8c37SJohannes Berg u32 duration; 320b8bc4b0aSJohannes Berg } remain; 321f30221e4SJohannes Berg struct { 322f30221e4SJohannes Berg struct sk_buff *frame; 323f30221e4SJohannes Berg u32 wait; 32428a1bcdbSJohannes Berg bool status; 325f30221e4SJohannes Berg } offchan_tx; 326f679f65dSJohannes Berg }; 327fffd0934SJohannes Berg 32866e67e41SJohannes Berg size_t data_len; 32966e67e41SJohannes Berg u8 data[]; 33077fdaa12SJohannes Berg }; 33177fdaa12SJohannes Berg 33246900298SJohannes Berg /* flags used in struct ieee80211_if_managed.flags */ 333ab1faeadSJohannes Berg enum ieee80211_sta_flags { 334b291ba11SJohannes Berg IEEE80211_STA_BEACON_POLL = BIT(0), 335b291ba11SJohannes Berg IEEE80211_STA_CONNECTION_POLL = BIT(1), 336b291ba11SJohannes Berg IEEE80211_STA_CONTROL_PORT = BIT(2), 337b291ba11SJohannes Berg IEEE80211_STA_DISABLE_11N = BIT(4), 338b291ba11SJohannes Berg IEEE80211_STA_CSA_RECEIVED = BIT(5), 339b291ba11SJohannes Berg IEEE80211_STA_MFP_ENABLED = BIT(6), 340ab13315aSKalle Valo IEEE80211_STA_UAPSD_ENABLED = BIT(7), 341375177bfSVivek Natarajan IEEE80211_STA_NULLFUNC_ACKED = BIT(8), 34217e4ec14SJouni Malinen IEEE80211_STA_RESET_SIGNAL_AVE = BIT(9), 343ab1faeadSJohannes Berg }; 344ab1faeadSJohannes Berg 34566e67e41SJohannes Berg struct ieee80211_mgd_auth_data { 34666e67e41SJohannes Berg struct cfg80211_bss *bss; 34766e67e41SJohannes Berg unsigned long timeout; 34866e67e41SJohannes Berg int tries; 34966e67e41SJohannes Berg u16 algorithm, expected_transaction; 35066e67e41SJohannes Berg 35166e67e41SJohannes Berg u8 key[WLAN_KEY_LEN_WEP104]; 35266e67e41SJohannes Berg u8 key_len, key_idx; 35366e67e41SJohannes Berg bool synced; 35466e67e41SJohannes Berg bool done; 35566e67e41SJohannes Berg 35666e67e41SJohannes Berg size_t ie_len; 35766e67e41SJohannes Berg u8 ie[]; 35866e67e41SJohannes Berg }; 35966e67e41SJohannes Berg 36066e67e41SJohannes Berg struct ieee80211_mgd_assoc_data { 36166e67e41SJohannes Berg struct cfg80211_bss *bss; 36266e67e41SJohannes Berg const u8 *supp_rates; 36366e67e41SJohannes Berg const u8 *ht_information_ie; 36466e67e41SJohannes Berg 36566e67e41SJohannes Berg unsigned long timeout; 36666e67e41SJohannes Berg int tries; 36766e67e41SJohannes Berg 36866e67e41SJohannes Berg u16 capability; 36966e67e41SJohannes Berg u8 prev_bssid[ETH_ALEN]; 37066e67e41SJohannes Berg u8 ssid[IEEE80211_MAX_SSID_LEN]; 37166e67e41SJohannes Berg u8 ssid_len; 37266e67e41SJohannes Berg u8 supp_rates_len; 37366e67e41SJohannes Berg bool wmm_used, uapsd_used; 37466e67e41SJohannes Berg bool have_beacon; 37566e67e41SJohannes Berg bool sent_assoc; 37666e67e41SJohannes Berg bool synced; 37766e67e41SJohannes Berg 37866e67e41SJohannes Berg size_t ie_len; 37966e67e41SJohannes Berg u8 ie[]; 38066e67e41SJohannes Berg }; 38166e67e41SJohannes Berg 38246900298SJohannes Berg struct ieee80211_if_managed { 383056cdd59SJohannes Berg struct timer_list timer; 384b291ba11SJohannes Berg struct timer_list conn_mon_timer; 385b291ba11SJohannes Berg struct timer_list bcn_mon_timer; 386c481ec97SSujith struct timer_list chswitch_timer; 387b291ba11SJohannes Berg struct work_struct monitor_work; 388c481ec97SSujith struct work_struct chswitch_work; 3891e4dcd01SJuuso Oikarinen struct work_struct beacon_connection_loss_work; 39046900298SJohannes Berg 3917ccc8bd7SFelix Fietkau unsigned long beacon_timeout; 392b291ba11SJohannes Berg unsigned long probe_timeout; 393a43abf29SMaxim Levitsky int probe_send_count; 39404ac3c0eSFelix Fietkau bool nullfunc_failed; 395b291ba11SJohannes Berg 39677fdaa12SJohannes Berg struct mutex mtx; 3970c1ad2caSJohannes Berg struct cfg80211_bss *associated; 39866e67e41SJohannes Berg struct ieee80211_mgd_auth_data *auth_data; 39966e67e41SJohannes Berg struct ieee80211_mgd_assoc_data *assoc_data; 40046900298SJohannes Berg 40177fdaa12SJohannes Berg u8 bssid[ETH_ALEN]; 40246900298SJohannes Berg 403f0706e82SJiri Benc u16 aid; 404f0706e82SJiri Benc 4055bb644a0SJohannes Berg unsigned long timers_running; /* used for quiesce/restart */ 406965bedadSJohannes Berg bool powersave; /* powersave requested for this iface */ 40705cb9108SJohannes Berg bool broken_ap; /* AP is broken -- turn off powersave */ 4080f78231bSJohannes Berg enum ieee80211_smps_mode req_smps, /* requested smps mode */ 409d1f5b7a3SJohannes Berg ap_smps, /* smps mode AP thinks we're in */ 410d1f5b7a3SJohannes Berg driver_smps_mode; /* smps mode request */ 411d1f5b7a3SJohannes Berg 412d1f5b7a3SJohannes Berg struct work_struct request_smps_work; 413965bedadSJohannes Berg 414d6f2da5bSJiri Slaby unsigned int flags; 415f0706e82SJiri Benc 416d8ec4433SJuuso Oikarinen bool beacon_crc_valid; 417d91f36dbSJohannes Berg u32 beacon_crc; 418d91f36dbSJohannes Berg 419fdfacf0aSJouni Malinen enum { 420fdfacf0aSJouni Malinen IEEE80211_MFP_DISABLED, 421fdfacf0aSJouni Malinen IEEE80211_MFP_OPTIONAL, 422fdfacf0aSJouni Malinen IEEE80211_MFP_REQUIRED 423fdfacf0aSJouni Malinen } mfp; /* management frame protection */ 424fdfacf0aSJouni Malinen 425f0706e82SJiri Benc int wmm_last_param_set; 4269bc383deSJohannes Berg 4279bc383deSJohannes Berg u8 use_4addr; 42817e4ec14SJouni Malinen 42917e4ec14SJouni Malinen /* Signal strength from the last Beacon frame in the current BSS. */ 43017e4ec14SJouni Malinen int last_beacon_signal; 43117e4ec14SJouni Malinen 43217e4ec14SJouni Malinen /* 43317e4ec14SJouni Malinen * Weighted average of the signal strength from Beacon frames in the 43417e4ec14SJouni Malinen * current BSS. This is in units of 1/16 of the signal unit to maintain 43517e4ec14SJouni Malinen * accuracy and to speed up calculations, i.e., the value need to be 43617e4ec14SJouni Malinen * divided by 16 to get the actual value. 43717e4ec14SJouni Malinen */ 43817e4ec14SJouni Malinen int ave_beacon_signal; 43917e4ec14SJouni Malinen 44017e4ec14SJouni Malinen /* 441391a200aSJouni Malinen * Number of Beacon frames used in ave_beacon_signal. This can be used 442391a200aSJouni Malinen * to avoid generating less reliable cqm events that would be based 443391a200aSJouni Malinen * only on couple of received frames. 444391a200aSJouni Malinen */ 445391a200aSJouni Malinen unsigned int count_beacon_signal; 446391a200aSJouni Malinen 447391a200aSJouni Malinen /* 44817e4ec14SJouni Malinen * Last Beacon frame signal strength average (ave_beacon_signal / 16) 44917e4ec14SJouni Malinen * that triggered a cqm event. 0 indicates that no event has been 45017e4ec14SJouni Malinen * generated for the current association. 45117e4ec14SJouni Malinen */ 45217e4ec14SJouni Malinen int last_cqm_event_signal; 453615f7b9bSMeenakshi Venkataraman 454615f7b9bSMeenakshi Venkataraman /* 455615f7b9bSMeenakshi Venkataraman * State variables for keeping track of RSSI of the AP currently 456615f7b9bSMeenakshi Venkataraman * connected to and informing driver when RSSI has gone 457615f7b9bSMeenakshi Venkataraman * below/above a certain threshold. 458615f7b9bSMeenakshi Venkataraman */ 459615f7b9bSMeenakshi Venkataraman int rssi_min_thold, rssi_max_thold; 460615f7b9bSMeenakshi Venkataraman int last_ave_beacon_signal; 461ef96a842SBen Greear 462ef96a842SBen Greear struct ieee80211_ht_cap ht_capa; /* configured ht-cap over-rides */ 463ef96a842SBen Greear struct ieee80211_ht_cap ht_capa_mask; /* Valid parts of ht_capa */ 464f0706e82SJiri Benc }; 465f0706e82SJiri Benc 46646900298SJohannes Berg struct ieee80211_if_ibss { 46746900298SJohannes Berg struct timer_list timer; 46846900298SJohannes Berg 4697a17a33cSJohannes Berg struct mutex mtx; 4707a17a33cSJohannes Berg 471af8cdcd8SJohannes Berg unsigned long last_scan_completed; 4725bb644a0SJohannes Berg 473fbd2c8dcSTeemu Paasikivi u32 basic_rates; 474fbd2c8dcSTeemu Paasikivi 4755bb644a0SJohannes Berg bool timer_running; 4765bb644a0SJohannes Berg 477af8cdcd8SJohannes Berg bool fixed_bssid; 478af8cdcd8SJohannes Berg bool fixed_channel; 479fffd0934SJohannes Berg bool privacy; 48046900298SJohannes Berg 481267335d6SAntonio Quartulli bool control_port; 482267335d6SAntonio Quartulli 48346900298SJohannes Berg u8 bssid[ETH_ALEN]; 484af8cdcd8SJohannes Berg u8 ssid[IEEE80211_MAX_SSID_LEN]; 485af8cdcd8SJohannes Berg u8 ssid_len, ie_len; 486af8cdcd8SJohannes Berg u8 *ie; 487af8cdcd8SJohannes Berg struct ieee80211_channel *channel; 48813c40c54SAlexander Simon enum nl80211_channel_type channel_type; 48946900298SJohannes Berg 49046900298SJohannes Berg unsigned long ibss_join_req; 491af8cdcd8SJohannes Berg /* probe response/beacon for IBSS */ 49240b275b6SJohannes Berg struct sk_buff __rcu *presp; 49340b275b6SJohannes Berg struct sk_buff *skb; 49446900298SJohannes Berg 4958bf11d8dSJohannes Berg spinlock_t incomplete_lock; 4968bf11d8dSJohannes Berg struct list_head incomplete_stations; 4978bf11d8dSJohannes Berg 49846900298SJohannes Berg enum { 49946900298SJohannes Berg IEEE80211_IBSS_MLME_SEARCH, 50046900298SJohannes Berg IEEE80211_IBSS_MLME_JOINED, 50146900298SJohannes Berg } state; 50246900298SJohannes Berg }; 50346900298SJohannes Berg 504472dbc45SJohannes Berg struct ieee80211_if_mesh { 505472dbc45SJohannes Berg struct timer_list housekeeping_timer; 506472dbc45SJohannes Berg struct timer_list mesh_path_timer; 507e304bfd3SRui Paulo struct timer_list mesh_path_root_timer; 508472dbc45SJohannes Berg 5095bb644a0SJohannes Berg unsigned long timers_running; 5105bb644a0SJohannes Berg 51118889231SJavier Cardona unsigned long wrkq_flags; 512472dbc45SJohannes Berg 513472dbc45SJohannes Berg u8 mesh_id[IEEE80211_MAX_MESH_ID_LEN]; 514472dbc45SJohannes Berg size_t mesh_id_len; 515472dbc45SJohannes Berg /* Active Path Selection Protocol Identifier */ 5163491707aSRui Paulo u8 mesh_pp_id; 517472dbc45SJohannes Berg /* Active Path Selection Metric Identifier */ 5183491707aSRui Paulo u8 mesh_pm_id; 519472dbc45SJohannes Berg /* Congestion Control Mode Identifier */ 5203491707aSRui Paulo u8 mesh_cc_id; 5219e03fdfdSJavier Cardona /* Synchronization Protocol Identifier */ 5223491707aSRui Paulo u8 mesh_sp_id; 5239e03fdfdSJavier Cardona /* Authentication Protocol Identifier */ 5243491707aSRui Paulo u8 mesh_auth_id; 525d19b3bf6SRui Paulo /* Local mesh Sequence Number */ 526d19b3bf6SRui Paulo u32 sn; 527472dbc45SJohannes Berg /* Last used PREQ ID */ 528472dbc45SJohannes Berg u32 preq_id; 529472dbc45SJohannes Berg atomic_t mpaths; 530d19b3bf6SRui Paulo /* Timestamp of last SN update */ 531d19b3bf6SRui Paulo unsigned long last_sn_update; 532dca7e943SThomas Pedersen /* Time when it's ok to send next PERR */ 533dca7e943SThomas Pedersen unsigned long next_perr; 534dca7e943SThomas Pedersen /* Timestamp of last PREQ sent */ 535472dbc45SJohannes Berg unsigned long last_preq; 536472dbc45SJohannes Berg struct mesh_rmc *rmc; 537472dbc45SJohannes Berg spinlock_t mesh_preq_queue_lock; 538472dbc45SJohannes Berg struct mesh_preq_queue preq_queue; 539472dbc45SJohannes Berg int preq_queue_len; 540472dbc45SJohannes Berg struct mesh_stats mshstats; 541472dbc45SJohannes Berg struct mesh_config mshcfg; 542472dbc45SJohannes Berg u32 mesh_seqnum; 543472dbc45SJohannes Berg bool accepting_plinks; 5445ee68e5bSJavier Cardona int num_gates; 545581a8b0fSJavier Cardona const u8 *ie; 546581a8b0fSJavier Cardona u8 ie_len; 547b130e5ceSJavier Cardona enum { 548b130e5ceSJavier Cardona IEEE80211_MESH_SEC_NONE = 0x0, 549b130e5ceSJavier Cardona IEEE80211_MESH_SEC_AUTHED = 0x1, 550b130e5ceSJavier Cardona IEEE80211_MESH_SEC_SECURED = 0x2, 551b130e5ceSJavier Cardona } security; 552472dbc45SJohannes Berg }; 553902acc78SJohannes Berg 554902acc78SJohannes Berg #ifdef CONFIG_MAC80211_MESH 555472dbc45SJohannes Berg #define IEEE80211_IFSTA_MESH_CTR_INC(msh, name) \ 556472dbc45SJohannes Berg do { (msh)->mshstats.name++; } while (0) 557902acc78SJohannes Berg #else 558472dbc45SJohannes Berg #define IEEE80211_IFSTA_MESH_CTR_INC(msh, name) \ 559902acc78SJohannes Berg do { } while (0) 560902acc78SJohannes Berg #endif 561f0706e82SJiri Benc 562213cd118SJohannes Berg /** 563213cd118SJohannes Berg * enum ieee80211_sub_if_data_flags - virtual interface flags 564213cd118SJohannes Berg * 565213cd118SJohannes Berg * @IEEE80211_SDATA_ALLMULTI: interface wants all multicast packets 566213cd118SJohannes Berg * @IEEE80211_SDATA_PROMISC: interface is promisc 567213cd118SJohannes Berg * @IEEE80211_SDATA_OPERATING_GMODE: operating in G-only mode 568213cd118SJohannes Berg * @IEEE80211_SDATA_DONT_BRIDGE_PACKETS: bridge packets between 569213cd118SJohannes Berg * associated stations and deliver multicast frames both 570213cd118SJohannes Berg * back to wireless media and to the local net stack. 57195acac61SJohannes Berg * @IEEE80211_SDATA_DISCONNECT_RESUME: Disconnect after resume. 5727b7eab6fSJohannes Berg * @IEEE80211_SDATA_IN_DRIVER: indicates interface was added to driver 573213cd118SJohannes Berg */ 574213cd118SJohannes Berg enum ieee80211_sub_if_data_flags { 575213cd118SJohannes Berg IEEE80211_SDATA_ALLMULTI = BIT(0), 576213cd118SJohannes Berg IEEE80211_SDATA_PROMISC = BIT(1), 5777986cf95SJohannes Berg IEEE80211_SDATA_OPERATING_GMODE = BIT(2), 5787986cf95SJohannes Berg IEEE80211_SDATA_DONT_BRIDGE_PACKETS = BIT(3), 57995acac61SJohannes Berg IEEE80211_SDATA_DISCONNECT_RESUME = BIT(4), 5807b7eab6fSJohannes Berg IEEE80211_SDATA_IN_DRIVER = BIT(5), 581213cd118SJohannes Berg }; 582213cd118SJohannes Berg 58334d4bc4dSJohannes Berg /** 58434d4bc4dSJohannes Berg * enum ieee80211_sdata_state_bits - virtual interface state bits 58534d4bc4dSJohannes Berg * @SDATA_STATE_RUNNING: virtual interface is up & running; this 58634d4bc4dSJohannes Berg * mirrors netif_running() but is separate for interface type 58734d4bc4dSJohannes Berg * change handling while the interface is up 5885b714c6aSJohannes Berg * @SDATA_STATE_OFFCHANNEL: This interface is currently in offchannel 5895b714c6aSJohannes Berg * mode, so queues are stopped 59034d4bc4dSJohannes Berg */ 59134d4bc4dSJohannes Berg enum ieee80211_sdata_state_bits { 59234d4bc4dSJohannes Berg SDATA_STATE_RUNNING, 5935b714c6aSJohannes Berg SDATA_STATE_OFFCHANNEL, 59434d4bc4dSJohannes Berg }; 59534d4bc4dSJohannes Berg 596f0706e82SJiri Benc struct ieee80211_sub_if_data { 597f0706e82SJiri Benc struct list_head list; 598f0706e82SJiri Benc 599f0706e82SJiri Benc struct wireless_dev wdev; 600f0706e82SJiri Benc 60111a843b7SJohannes Berg /* keys */ 60211a843b7SJohannes Berg struct list_head key_list; 60311a843b7SJohannes Berg 6043bff1865SYogesh Ashok Powar /* count for keys needing tailroom space allocation */ 6053bff1865SYogesh Ashok Powar int crypto_tx_tailroom_needed_cnt; 6063bff1865SYogesh Ashok Powar 607f0706e82SJiri Benc struct net_device *dev; 608f0706e82SJiri Benc struct ieee80211_local *local; 609f0706e82SJiri Benc 61013262ffdSJiri Slaby unsigned int flags; 6117e9ed188SDaniel Drake 61234d4bc4dSJohannes Berg unsigned long state; 61334d4bc4dSJohannes Berg 614f0706e82SJiri Benc int drop_unencrypted; 615f0706e82SJiri Benc 61647846c9bSJohannes Berg char name[IFNAMSIZ]; 61747846c9bSJohannes Berg 618413ad50aSJohannes Berg /* 619413ad50aSJohannes Berg * keep track of whether the HT opmode (stored in 620413ad50aSJohannes Berg * vif.bss_info.ht_operation_mode) is valid. 621413ad50aSJohannes Berg */ 622413ad50aSJohannes Berg bool ht_opmode_valid; 623413ad50aSJohannes Berg 6247da7cc1dSJohannes Berg /* to detect idle changes */ 6257da7cc1dSJohannes Berg bool old_idle; 6267da7cc1dSJohannes Berg 627f0706e82SJiri Benc /* Fragment table for host-based reassembly */ 628f0706e82SJiri Benc struct ieee80211_fragment_entry fragments[IEEE80211_FRAGMENT_MAX]; 629f0706e82SJiri Benc unsigned int fragment_next; 630f0706e82SJiri Benc 631b53be792SSimon Wunderlich /* TID bitmap for NoAck policy */ 632b53be792SSimon Wunderlich u16 noack_map; 633b53be792SSimon Wunderlich 63440b275b6SJohannes Berg struct ieee80211_key __rcu *keys[NUM_DEFAULT_KEYS + NUM_DEFAULT_MGMT_KEYS]; 63540b275b6SJohannes Berg struct ieee80211_key __rcu *default_unicast_key; 63640b275b6SJohannes Berg struct ieee80211_key __rcu *default_multicast_key; 63740b275b6SJohannes Berg struct ieee80211_key __rcu *default_mgmt_key; 638f0706e82SJiri Benc 63994778280SJohannes Berg u16 sequence_number; 640a621fa4dSJohannes Berg __be16 control_port_protocol; 641a621fa4dSJohannes Berg bool control_port_no_encrypt; 64294778280SJohannes Berg 643f6f3def3SEliad Peller struct ieee80211_tx_queue_params tx_conf[IEEE80211_MAX_QUEUES]; 644f6f3def3SEliad Peller 64564592c8fSJohannes Berg struct work_struct work; 64635f20c14SJohannes Berg struct sk_buff_head skb_queue; 64735f20c14SJohannes Berg 64868542962SJuuso Oikarinen bool arp_filter_state; 64968542962SJuuso Oikarinen 6503e122be0SJohannes Berg /* 6513e122be0SJohannes Berg * AP this belongs to: self in AP mode and 6523e122be0SJohannes Berg * corresponding AP in VLAN mode, NULL for 6533e122be0SJohannes Berg * all others (might be needed later in IBSS) 6543e122be0SJohannes Berg */ 6553e122be0SJohannes Berg struct ieee80211_if_ap *bss; 6563e122be0SJohannes Berg 65737eb0b16SJouni Malinen /* bitmap of allowed (non-MCS) rate indexes for rate control */ 65837eb0b16SJouni Malinen u32 rc_rateidx_mask[IEEE80211_NUM_BANDS]; 65919468413SSimon Wunderlich u8 rc_rateidx_mcs_mask[IEEE80211_NUM_BANDS][IEEE80211_HT_MCS_MASK_LEN]; 660f0706e82SJiri Benc 661f0706e82SJiri Benc union { 662f0706e82SJiri Benc struct ieee80211_if_ap ap; 663f0706e82SJiri Benc struct ieee80211_if_wds wds; 664f0706e82SJiri Benc struct ieee80211_if_vlan vlan; 66546900298SJohannes Berg struct ieee80211_if_managed mgd; 66646900298SJohannes Berg struct ieee80211_if_ibss ibss; 667472dbc45SJohannes Berg struct ieee80211_if_mesh mesh; 6688cc9a739SMichael Wu u32 mntr_flags; 669f0706e82SJiri Benc } u; 670e9f207f0SJiri Benc 671e9f207f0SJiri Benc #ifdef CONFIG_MAC80211_DEBUGFS 672e9f207f0SJiri Benc struct { 6737bcfaf2fSJohannes Berg struct dentry *dir; 674295bafb4SBen Greear struct dentry *subdir_stations; 675f7e0104cSJohannes Berg struct dentry *default_unicast_key; 676f7e0104cSJohannes Berg struct dentry *default_multicast_key; 6773cfcf6acSJouni Malinen struct dentry *default_mgmt_key; 6787bcfaf2fSJohannes Berg } debugfs; 679e9f207f0SJiri Benc #endif 68032bfd35dSJohannes Berg /* must be last, dynamically sized area in this! */ 68132bfd35dSJohannes Berg struct ieee80211_vif vif; 682f0706e82SJiri Benc }; 683f0706e82SJiri Benc 68432bfd35dSJohannes Berg static inline 68532bfd35dSJohannes Berg struct ieee80211_sub_if_data *vif_to_sdata(struct ieee80211_vif *p) 68632bfd35dSJohannes Berg { 68732bfd35dSJohannes Berg return container_of(p, struct ieee80211_sub_if_data, vif); 68832bfd35dSJohannes Berg } 68932bfd35dSJohannes Berg 690c1475ca9SJohannes Berg enum sdata_queue_type { 691c1475ca9SJohannes Berg IEEE80211_SDATA_QUEUE_TYPE_FRAME = 0, 692c1475ca9SJohannes Berg IEEE80211_SDATA_QUEUE_AGG_START = 1, 693c1475ca9SJohannes Berg IEEE80211_SDATA_QUEUE_AGG_STOP = 2, 694c1475ca9SJohannes Berg }; 695c1475ca9SJohannes Berg 696f0706e82SJiri Benc enum { 697f0706e82SJiri Benc IEEE80211_RX_MSG = 1, 698f0706e82SJiri Benc IEEE80211_TX_STATUS_MSG = 2, 69937fbd908SJohannes Berg IEEE80211_EOSP_MSG = 3, 70037fbd908SJohannes Berg }; 70137fbd908SJohannes Berg 70237fbd908SJohannes Berg struct skb_eosp_msg_data { 70337fbd908SJohannes Berg u8 sta[ETH_ALEN], iface[ETH_ALEN]; 704f0706e82SJiri Benc }; 705f0706e82SJiri Benc 706ce7c9111SKalle Valo enum queue_stop_reason { 707ce7c9111SKalle Valo IEEE80211_QUEUE_STOP_REASON_DRIVER, 708520eb820SKalle Valo IEEE80211_QUEUE_STOP_REASON_PS, 70996f5e66eSJohannes Berg IEEE80211_QUEUE_STOP_REASON_CSA, 71096f5e66eSJohannes Berg IEEE80211_QUEUE_STOP_REASON_AGGREGATION, 71125420604SJohannes Berg IEEE80211_QUEUE_STOP_REASON_SUSPEND, 7128f77f384SJohannes Berg IEEE80211_QUEUE_STOP_REASON_SKB_ADD, 713693828feSRajkumar Manoharan IEEE80211_QUEUE_STOP_REASON_CHTYPE_CHANGE, 714ce7c9111SKalle Valo }; 715ce7c9111SKalle Valo 71665a6538aSLuciano Coelho #ifdef CONFIG_MAC80211_LEDS 717e1e54068SJohannes Berg struct tpt_led_trigger { 718e1e54068SJohannes Berg struct led_trigger trig; 719e1e54068SJohannes Berg char name[32]; 720e1e54068SJohannes Berg const struct ieee80211_tpt_blink *blink_table; 721e1e54068SJohannes Berg unsigned int blink_table_len; 722e1e54068SJohannes Berg struct timer_list timer; 723e1e54068SJohannes Berg unsigned long prev_traffic; 724e1e54068SJohannes Berg unsigned long tx_bytes, rx_bytes; 72567408c8cSJohannes Berg unsigned int active, want; 72667408c8cSJohannes Berg bool running; 727e1e54068SJohannes Berg }; 72865a6538aSLuciano Coelho #endif 729e1e54068SJohannes Berg 730142b9f50SHelmut Schaa /** 731142b9f50SHelmut Schaa * mac80211 scan flags - currently active scan mode 732142b9f50SHelmut Schaa * 733142b9f50SHelmut Schaa * @SCAN_SW_SCANNING: We're currently in the process of scanning but may as 734142b9f50SHelmut Schaa * well be on the operating channel 735142b9f50SHelmut Schaa * @SCAN_HW_SCANNING: The hardware is scanning for us, we have no way to 736142b9f50SHelmut Schaa * determine if we are on the operating channel or not 7378789d459SJohannes Berg * @SCAN_COMPLETED: Set for our scan work function when the driver reported 7388789d459SJohannes Berg * that the scan completed. 7398789d459SJohannes Berg * @SCAN_ABORTED: Set for our scan work function when the driver reported 7408789d459SJohannes Berg * a scan complete for an aborted scan. 741142b9f50SHelmut Schaa */ 742fbe9c429SHelmut Schaa enum { 743fbe9c429SHelmut Schaa SCAN_SW_SCANNING, 744142b9f50SHelmut Schaa SCAN_HW_SCANNING, 7458789d459SJohannes Berg SCAN_COMPLETED, 7468789d459SJohannes Berg SCAN_ABORTED, 747142b9f50SHelmut Schaa }; 748142b9f50SHelmut Schaa 749142b9f50SHelmut Schaa /** 750142b9f50SHelmut Schaa * enum mac80211_scan_state - scan state machine states 751142b9f50SHelmut Schaa * 752142b9f50SHelmut Schaa * @SCAN_DECISION: Main entry point to the scan state machine, this state 753142b9f50SHelmut Schaa * determines if we should keep on scanning or switch back to the 754142b9f50SHelmut Schaa * operating channel 755142b9f50SHelmut Schaa * @SCAN_SET_CHANNEL: Set the next channel to be scanned 756142b9f50SHelmut Schaa * @SCAN_SEND_PROBE: Send probe requests and wait for probe responses 75707ef03eeSJohannes Berg * @SCAN_SUSPEND: Suspend the scan and go back to operating channel to 75807ef03eeSJohannes Berg * send out data 75907ef03eeSJohannes Berg * @SCAN_RESUME: Resume the scan and scan the next channel 760142b9f50SHelmut Schaa */ 761142b9f50SHelmut Schaa enum mac80211_scan_state { 762142b9f50SHelmut Schaa SCAN_DECISION, 763142b9f50SHelmut Schaa SCAN_SET_CHANNEL, 764142b9f50SHelmut Schaa SCAN_SEND_PROBE, 76507ef03eeSJohannes Berg SCAN_SUSPEND, 76607ef03eeSJohannes Berg SCAN_RESUME, 767fbe9c429SHelmut Schaa }; 768fbe9c429SHelmut Schaa 769f0706e82SJiri Benc struct ieee80211_local { 770f0706e82SJiri Benc /* embed the driver visible part. 771f0706e82SJiri Benc * don't cast (use the static inlines below), but we keep 772f0706e82SJiri Benc * it first anyway so they become a no-op */ 773f0706e82SJiri Benc struct ieee80211_hw hw; 774f0706e82SJiri Benc 775f0706e82SJiri Benc const struct ieee80211_ops *ops; 776f0706e82SJiri Benc 77742935ecaSLuis R. Rodriguez /* 778af6b6374SJohannes Berg * work stuff, potentially off-channel (in the future) 779af6b6374SJohannes Berg */ 780af6b6374SJohannes Berg struct list_head work_list; 781af6b6374SJohannes Berg struct timer_list work_timer; 782af6b6374SJohannes Berg struct work_struct work_work; 783af6b6374SJohannes Berg 784af6b6374SJohannes Berg /* 78542935ecaSLuis R. Rodriguez * private workqueue to mac80211. mac80211 makes this accessible 78642935ecaSLuis R. Rodriguez * via ieee80211_queue_work() 78742935ecaSLuis R. Rodriguez */ 78842935ecaSLuis R. Rodriguez struct workqueue_struct *workqueue; 78942935ecaSLuis R. Rodriguez 790e4e72fb4SJohannes Berg unsigned long queue_stop_reasons[IEEE80211_MAX_QUEUES]; 79196f5e66eSJohannes Berg /* also used to protect ampdu_ac_queue and amdpu_ac_stop_refcnt */ 792ce7c9111SKalle Valo spinlock_t queue_stop_reason_lock; 79396f5e66eSJohannes Berg 794f0706e82SJiri Benc int open_count; 7953d30d949SMichael Wu int monitors, cooked_mntrs; 7968cc9a739SMichael Wu /* number of interfaces with corresponding FIF_ flags */ 7977be5086dSJohannes Berg int fif_fcsfail, fif_plcpfail, fif_control, fif_other_bss, fif_pspoll, 7987be5086dSJohannes Berg fif_probe_req; 7997be5086dSJohannes Berg int probe_req_reg; 8004150c572SJohannes Berg unsigned int filter_flags; /* FIF_* */ 8013b8d81e0SJohannes Berg 8023ffc2a90SJohannes Berg bool wiphy_ciphers_allocated; 8033ffc2a90SJohannes Berg 8043b8d81e0SJohannes Berg /* protects the aggregated multicast list and filter calls */ 8053b8d81e0SJohannes Berg spinlock_t filter_lock; 8063b8d81e0SJohannes Berg 8073ac64beeSJohannes Berg /* used for uploading changed mc list */ 8083ac64beeSJohannes Berg struct work_struct reconfig_filter; 8093ac64beeSJohannes Berg 8100f78231bSJohannes Berg /* used to reconfigure hardware SM PS */ 8110f78231bSJohannes Berg struct work_struct recalc_smps; 8120f78231bSJohannes Berg 8133b8d81e0SJohannes Berg /* aggregated multicast list */ 81422bedad3SJiri Pirko struct netdev_hw_addr_list mc_list; 8153b8d81e0SJohannes Berg 816d0709a65SJohannes Berg bool tim_in_locked_section; /* see ieee80211_beacon_get() */ 8175bb644a0SJohannes Berg 8185bb644a0SJohannes Berg /* 8195bb644a0SJohannes Berg * suspended is true if we finished all the suspend _and_ we have 8205bb644a0SJohannes Berg * not yet come up from resume. This is to be used by mac80211 8215bb644a0SJohannes Berg * to ensure driver sanity during suspend and mac80211's own 8225bb644a0SJohannes Berg * sanity. It can eventually be used for WoW as well. 8235bb644a0SJohannes Berg */ 8245bb644a0SJohannes Berg bool suspended; 8255bb644a0SJohannes Berg 8265bb644a0SJohannes Berg /* 827ceb99fe0SJohannes Berg * Resuming is true while suspended, but when we're reprogramming the 828ceb99fe0SJohannes Berg * hardware -- at that time it's allowed to use ieee80211_queue_work() 829ceb99fe0SJohannes Berg * again even though some other parts of the stack are still suspended 830ceb99fe0SJohannes Berg * and we still drop received frames to avoid waking the stack. 831ceb99fe0SJohannes Berg */ 832ceb99fe0SJohannes Berg bool resuming; 833ceb99fe0SJohannes Berg 834ceb99fe0SJohannes Berg /* 8355bb644a0SJohannes Berg * quiescing is true during the suspend process _only_ to 8365bb644a0SJohannes Berg * ease timer cancelling etc. 8375bb644a0SJohannes Berg */ 8385bb644a0SJohannes Berg bool quiescing; 8395bb644a0SJohannes Berg 840ea77f12fSJohannes Berg /* device is started */ 841ea77f12fSJohannes Berg bool started; 842ea77f12fSJohannes Berg 843eecc4800SJohannes Berg /* wowlan is enabled -- don't reconfig on resume */ 844eecc4800SJohannes Berg bool wowlan; 845eecc4800SJohannes Berg 846b306f453SJohannes Berg int tx_headroom; /* required headroom for hardware/radiotap */ 847f0706e82SJiri Benc 848f0706e82SJiri Benc /* Tasklet and skb queue to process calls from IRQ mode. All frames 849f0706e82SJiri Benc * added to skb_queue will be processed, but frames in 850f0706e82SJiri Benc * skb_queue_unreliable may be dropped if the total length of these 851f0706e82SJiri Benc * queues increases over the limit. */ 852f0706e82SJiri Benc #define IEEE80211_IRQSAFE_QUEUE_LIMIT 128 853f0706e82SJiri Benc struct tasklet_struct tasklet; 854f0706e82SJiri Benc struct sk_buff_head skb_queue; 855f0706e82SJiri Benc struct sk_buff_head skb_queue_unreliable; 856f0706e82SJiri Benc 85724a8fdadSChristian Lamparter /* 85824a8fdadSChristian Lamparter * Internal FIFO queue which is shared between multiple rx path 85924a8fdadSChristian Lamparter * stages. Its main task is to provide a serialization mechanism, 86024a8fdadSChristian Lamparter * so all rx handlers can enjoy having exclusive access to their 86124a8fdadSChristian Lamparter * private data structures. 86224a8fdadSChristian Lamparter */ 86324a8fdadSChristian Lamparter struct sk_buff_head rx_skb_queue; 86424a8fdadSChristian Lamparter bool running_rx_handler; /* protected by rx_skb_queue.lock */ 86524a8fdadSChristian Lamparter 866d0709a65SJohannes Berg /* Station data */ 867d0709a65SJohannes Berg /* 8684d33960bSJohannes Berg * The mutex only protects the list, hash table and 8694d33960bSJohannes Berg * counter, reads are done with RCU. 870d0709a65SJohannes Berg */ 87134e89507SJohannes Berg struct mutex sta_mtx; 8724d33960bSJohannes Berg spinlock_t tim_lock; 873d0709a65SJohannes Berg unsigned long num_sta; 8744d33960bSJohannes Berg struct list_head sta_list; 87540b275b6SJohannes Berg struct sta_info __rcu *sta_hash[STA_HASH_SIZE]; 876f0706e82SJiri Benc struct timer_list sta_cleanup; 877f5ea9120SJohannes Berg int sta_generation; 878f0706e82SJiri Benc 8792a577d98SJohannes Berg struct sk_buff_head pending[IEEE80211_MAX_QUEUES]; 880f0706e82SJiri Benc struct tasklet_struct tx_pending_tasklet; 881f0706e82SJiri Benc 882a6a67db2SJohannes Berg atomic_t agg_queue_stop[IEEE80211_MAX_QUEUES]; 883cd8ffc80SJohannes Berg 884f0706e82SJiri Benc /* number of interfaces with corresponding IFF_ flags */ 88553918994SJohannes Berg atomic_t iff_allmultis, iff_promiscs; 886f0706e82SJiri Benc 887f0706e82SJiri Benc struct rate_control_ref *rate_ctrl; 888f0706e82SJiri Benc 8895f9f1812SFelix Fietkau struct crypto_cipher *wep_tx_tfm; 8905f9f1812SFelix Fietkau struct crypto_cipher *wep_rx_tfm; 891f0706e82SJiri Benc u32 wep_iv; 892f0706e82SJiri Benc 893c771c9d8SJohannes Berg /* see iface.c */ 89479010420SJohannes Berg struct list_head interfaces; 895c771c9d8SJohannes Berg struct mutex iflist_mtx; 89679010420SJohannes Berg 897b16bd15cSJohannes Berg /* 898ad0e2b5aSJohannes Berg * Key mutex, protects sdata's key_list and sta_info's 899b16bd15cSJohannes Berg * key pointers (write access, they're RCU.) 900b16bd15cSJohannes Berg */ 901ad0e2b5aSJohannes Berg struct mutex key_mtx; 902b16bd15cSJohannes Berg 903a1699b75SJohannes Berg /* mutex for scan and work locking */ 904a1699b75SJohannes Berg struct mutex mtx; 905b16bd15cSJohannes Berg 906c2b13452SJohannes Berg /* Scanning and BSS list */ 907fbe9c429SHelmut Schaa unsigned long scanning; 9082a519311SJohannes Berg struct cfg80211_ssid scan_ssid; 9095ba63533SJohannes Berg struct cfg80211_scan_request *int_scan_req; 9104d36ec58SJohannes Berg struct cfg80211_scan_request *scan_req, *hw_scan_req; 9112a519311SJohannes Berg struct ieee80211_channel *scan_channel; 9124d36ec58SJohannes Berg enum ieee80211_band hw_scan_band; 913f0706e82SJiri Benc int scan_channel_idx; 914de95a54bSJohannes Berg int scan_ies_len; 9158318d78aSJohannes Berg 91679f460caSLuciano Coelho bool sched_scanning; 91779f460caSLuciano Coelho struct ieee80211_sched_scan_ies sched_scan_ies; 91885a9994aSLuciano Coelho struct work_struct sched_scan_stopped_work; 91979f460caSLuciano Coelho 920df13cce5SHelmut Schaa unsigned long leave_oper_channel_time; 921977923b0SHelmut Schaa enum mac80211_scan_state next_scan_state; 922f0706e82SJiri Benc struct delayed_work scan_work; 923491775a5SJohannes Berg struct ieee80211_sub_if_data *scan_sdata; 9240aaffa9bSJohannes Berg enum nl80211_channel_type _oper_channel_type; 9252a519311SJohannes Berg struct ieee80211_channel *oper_channel, *csa_channel; 926f0706e82SJiri Benc 927b8bc4b0aSJohannes Berg /* Temporary remain-on-channel for off-channel operations */ 928b8bc4b0aSJohannes Berg struct ieee80211_channel *tmp_channel; 929b8bc4b0aSJohannes Berg enum nl80211_channel_type tmp_channel_type; 930b8bc4b0aSJohannes Berg 931f0706e82SJiri Benc /* SNMP counters */ 932f0706e82SJiri Benc /* dot11CountersTable */ 933f0706e82SJiri Benc u32 dot11TransmittedFragmentCount; 934f0706e82SJiri Benc u32 dot11MulticastTransmittedFrameCount; 935f0706e82SJiri Benc u32 dot11FailedCount; 936f0706e82SJiri Benc u32 dot11RetryCount; 937f0706e82SJiri Benc u32 dot11MultipleRetryCount; 938f0706e82SJiri Benc u32 dot11FrameDuplicateCount; 939f0706e82SJiri Benc u32 dot11ReceivedFragmentCount; 940f0706e82SJiri Benc u32 dot11MulticastReceivedFrameCount; 941f0706e82SJiri Benc u32 dot11TransmittedFrameCount; 942f0706e82SJiri Benc 943f0706e82SJiri Benc #ifdef CONFIG_MAC80211_LEDS 944f0706e82SJiri Benc int tx_led_counter, rx_led_counter; 945cdcb006fSIvo van Doorn struct led_trigger *tx_led, *rx_led, *assoc_led, *radio_led; 946e1e54068SJohannes Berg struct tpt_led_trigger *tpt_led_trigger; 947cdcb006fSIvo van Doorn char tx_led_name[32], rx_led_name[32], 948cdcb006fSIvo van Doorn assoc_led_name[32], radio_led_name[32]; 949f0706e82SJiri Benc #endif 950f0706e82SJiri Benc 951f0706e82SJiri Benc #ifdef CONFIG_MAC80211_DEBUG_COUNTERS 952f0706e82SJiri Benc /* TX/RX handler statistics */ 953f0706e82SJiri Benc unsigned int tx_handlers_drop; 954f0706e82SJiri Benc unsigned int tx_handlers_queued; 955f0706e82SJiri Benc unsigned int tx_handlers_drop_unencrypted; 956f0706e82SJiri Benc unsigned int tx_handlers_drop_fragment; 957f0706e82SJiri Benc unsigned int tx_handlers_drop_wep; 958f0706e82SJiri Benc unsigned int tx_handlers_drop_not_assoc; 959f0706e82SJiri Benc unsigned int tx_handlers_drop_unauth_port; 960f0706e82SJiri Benc unsigned int rx_handlers_drop; 961f0706e82SJiri Benc unsigned int rx_handlers_queued; 962f0706e82SJiri Benc unsigned int rx_handlers_drop_nullfunc; 963f0706e82SJiri Benc unsigned int rx_handlers_drop_defrag; 964f0706e82SJiri Benc unsigned int rx_handlers_drop_short; 965f0706e82SJiri Benc unsigned int rx_handlers_drop_passive_scan; 966f0706e82SJiri Benc unsigned int tx_expand_skb_head; 967f0706e82SJiri Benc unsigned int tx_expand_skb_head_cloned; 968f0706e82SJiri Benc unsigned int rx_expand_skb_head; 969f0706e82SJiri Benc unsigned int rx_expand_skb_head2; 970f0706e82SJiri Benc unsigned int rx_handlers_fragments; 971f0706e82SJiri Benc unsigned int tx_status_drop; 972f0706e82SJiri Benc #define I802_DEBUG_INC(c) (c)++ 973f0706e82SJiri Benc #else /* CONFIG_MAC80211_DEBUG_COUNTERS */ 974f0706e82SJiri Benc #define I802_DEBUG_INC(c) do { } while (0) 975f0706e82SJiri Benc #endif /* CONFIG_MAC80211_DEBUG_COUNTERS */ 976f0706e82SJiri Benc 977f0706e82SJiri Benc 978f0706e82SJiri Benc int total_ps_buffered; /* total number of all buffered unicast and 979f0706e82SJiri Benc * multicast packets for power saving stations 980f0706e82SJiri Benc */ 981f0706e82SJiri Benc unsigned int wmm_acm; /* bit field of ACM bits (BIT(802.1D tag)) */ 982520eb820SKalle Valo 98350ae0cf1SKalle Valo /* 98450ae0cf1SKalle Valo * Bitmask of enabled u-apsd queues, 98550ae0cf1SKalle Valo * IEEE80211_WMM_IE_STA_QOSINFO_AC_BE & co. Needs a new association 98650ae0cf1SKalle Valo * to take effect. 98750ae0cf1SKalle Valo */ 98850ae0cf1SKalle Valo unsigned int uapsd_queues; 98950ae0cf1SKalle Valo 99050ae0cf1SKalle Valo /* 99150ae0cf1SKalle Valo * Maximum number of buffered frames AP can deliver during a 99250ae0cf1SKalle Valo * service period, IEEE80211_WMM_IE_STA_QOSINFO_SP_ALL or similar. 99350ae0cf1SKalle Valo * Needs a new association to take effect. 99450ae0cf1SKalle Valo */ 99550ae0cf1SKalle Valo unsigned int uapsd_max_sp_len; 99650ae0cf1SKalle Valo 997572e0012SKalle Valo bool pspolling; 998b203ffc3SJouni Malinen bool offchannel_ps_enabled; 999965bedadSJohannes Berg /* 1000965bedadSJohannes Berg * PS can only be enabled when we have exactly one managed 1001965bedadSJohannes Berg * interface (and monitors) in PS, this then points there. 1002965bedadSJohannes Berg */ 1003965bedadSJohannes Berg struct ieee80211_sub_if_data *ps_sdata; 1004520eb820SKalle Valo struct work_struct dynamic_ps_enable_work; 1005520eb820SKalle Valo struct work_struct dynamic_ps_disable_work; 1006520eb820SKalle Valo struct timer_list dynamic_ps_timer; 100710f644a4SJohannes Berg struct notifier_block network_latency_notifier; 10082b2c009eSJuuso Oikarinen struct notifier_block ifa_notifier; 1009f0706e82SJiri Benc 1010ff616381SJuuso Oikarinen /* 1011ff616381SJuuso Oikarinen * The dynamic ps timeout configured from user space via WEXT - 1012ff616381SJuuso Oikarinen * this will override whatever chosen by mac80211 internally. 1013ff616381SJuuso Oikarinen */ 1014ff616381SJuuso Oikarinen int dynamic_ps_forced_timeout; 1015f90754c1SJuuso Oikarinen int dynamic_ps_user_timeout; 1016f90754c1SJuuso Oikarinen bool disable_dynamic_ps; 1017ff616381SJuuso Oikarinen 10182bf30fabSJohannes Berg int user_power_level; /* in dBm */ 1019a8302de9SVasanthakumar Thiagarajan int power_constr_level; /* in dBm */ 10202bf30fabSJohannes Berg 10210f78231bSJohannes Berg enum ieee80211_smps_mode smps_mode; 10220f78231bSJohannes Berg 1023f2753ddbSJohannes Berg struct work_struct restart_work; 1024f2753ddbSJohannes Berg 1025e9f207f0SJiri Benc #ifdef CONFIG_MAC80211_DEBUGFS 1026e9f207f0SJiri Benc struct local_debugfsdentries { 10274b7679a5SJohannes Berg struct dentry *rcdir; 1028e9f207f0SJiri Benc struct dentry *keys; 1029e9f207f0SJiri Benc } debugfs; 1030e9f207f0SJiri Benc #endif 10314e6cbfd0SJohn W. Linville 103221f83589SJohannes Berg struct ieee80211_channel *hw_roc_channel; 103321f83589SJohannes Berg struct net_device *hw_roc_dev; 10344334ec85SJohannes Berg struct sk_buff *hw_roc_skb, *hw_roc_skb_for_status; 103521f83589SJohannes Berg struct work_struct hw_roc_start, hw_roc_done; 103621f83589SJohannes Berg enum nl80211_channel_type hw_roc_channel_type; 103721f83589SJohannes Berg unsigned int hw_roc_duration; 103821f83589SJohannes Berg u32 hw_roc_cookie; 103990fc4b3aSJohannes Berg bool hw_roc_for_tx; 104021f83589SJohannes Berg 1041a729cff8SJohannes Berg struct idr ack_status_frames; 1042a729cff8SJohannes Berg spinlock_t ack_status_lock; 1043a729cff8SJohannes Berg 10444e6cbfd0SJohn W. Linville /* dummy netdev for use w/ NAPI */ 10454e6cbfd0SJohn W. Linville struct net_device napi_dev; 10464e6cbfd0SJohn W. Linville 10474e6cbfd0SJohn W. Linville struct napi_struct napi; 1048f0706e82SJiri Benc }; 1049f0706e82SJiri Benc 10503e122be0SJohannes Berg static inline struct ieee80211_sub_if_data * 10513e122be0SJohannes Berg IEEE80211_DEV_TO_SUB_IF(struct net_device *dev) 10523e122be0SJohannes Berg { 10533e122be0SJohannes Berg return netdev_priv(dev); 10543e122be0SJohannes Berg } 10553e122be0SJohannes Berg 1056c1475ca9SJohannes Berg /* this struct represents 802.11n's RA/TID combination */ 1057eadc8d9eSRon Rindjunsky struct ieee80211_ra_tid { 1058eadc8d9eSRon Rindjunsky u8 ra[ETH_ALEN]; 1059eadc8d9eSRon Rindjunsky u16 tid; 1060eadc8d9eSRon Rindjunsky }; 1061eadc8d9eSRon Rindjunsky 1062dd76986bSJohannes Berg /* Parsed Information Elements */ 1063dd76986bSJohannes Berg struct ieee802_11_elems { 1064dd76986bSJohannes Berg u8 *ie_start; 1065dd76986bSJohannes Berg size_t total_len; 1066dd76986bSJohannes Berg 1067dd76986bSJohannes Berg /* pointers to IEs */ 1068dd76986bSJohannes Berg u8 *ssid; 1069dd76986bSJohannes Berg u8 *supp_rates; 1070dd76986bSJohannes Berg u8 *fh_params; 1071dd76986bSJohannes Berg u8 *ds_params; 1072dd76986bSJohannes Berg u8 *cf_params; 1073dd76986bSJohannes Berg struct ieee80211_tim_ie *tim; 1074dd76986bSJohannes Berg u8 *ibss_params; 1075dd76986bSJohannes Berg u8 *challenge; 1076dd76986bSJohannes Berg u8 *wpa; 1077dd76986bSJohannes Berg u8 *rsn; 1078dd76986bSJohannes Berg u8 *erp_info; 1079dd76986bSJohannes Berg u8 *ext_supp_rates; 1080dd76986bSJohannes Berg u8 *wmm_info; 1081dd76986bSJohannes Berg u8 *wmm_param; 1082dd76986bSJohannes Berg struct ieee80211_ht_cap *ht_cap_elem; 1083dd76986bSJohannes Berg struct ieee80211_ht_info *ht_info_elem; 1084dd76986bSJohannes Berg struct ieee80211_meshconf_ie *mesh_config; 1085dd76986bSJohannes Berg u8 *mesh_id; 1086dd76986bSJohannes Berg u8 *peering; 1087dd76986bSJohannes Berg u8 *preq; 1088dd76986bSJohannes Berg u8 *prep; 1089dd76986bSJohannes Berg u8 *perr; 1090dd76986bSJohannes Berg struct ieee80211_rann_ie *rann; 1091dd76986bSJohannes Berg u8 *ch_switch_elem; 1092dd76986bSJohannes Berg u8 *country_elem; 1093dd76986bSJohannes Berg u8 *pwr_constr_elem; 1094dd76986bSJohannes Berg u8 *quiet_elem; /* first quite element */ 1095dd76986bSJohannes Berg u8 *timeout_int; 1096dd76986bSJohannes Berg 1097dd76986bSJohannes Berg /* length of them, respectively */ 1098dd76986bSJohannes Berg u8 ssid_len; 1099dd76986bSJohannes Berg u8 supp_rates_len; 1100dd76986bSJohannes Berg u8 fh_params_len; 1101dd76986bSJohannes Berg u8 ds_params_len; 1102dd76986bSJohannes Berg u8 cf_params_len; 1103dd76986bSJohannes Berg u8 tim_len; 1104dd76986bSJohannes Berg u8 ibss_params_len; 1105dd76986bSJohannes Berg u8 challenge_len; 1106dd76986bSJohannes Berg u8 wpa_len; 1107dd76986bSJohannes Berg u8 rsn_len; 1108dd76986bSJohannes Berg u8 erp_info_len; 1109dd76986bSJohannes Berg u8 ext_supp_rates_len; 1110dd76986bSJohannes Berg u8 wmm_info_len; 1111dd76986bSJohannes Berg u8 wmm_param_len; 1112dd76986bSJohannes Berg u8 mesh_id_len; 1113dd76986bSJohannes Berg u8 peering_len; 1114dd76986bSJohannes Berg u8 preq_len; 1115dd76986bSJohannes Berg u8 prep_len; 1116dd76986bSJohannes Berg u8 perr_len; 1117dd76986bSJohannes Berg u8 ch_switch_elem_len; 1118dd76986bSJohannes Berg u8 country_elem_len; 1119dd76986bSJohannes Berg u8 pwr_constr_elem_len; 1120dd76986bSJohannes Berg u8 quiet_elem_len; 1121dd76986bSJohannes Berg u8 num_of_quiet_elem; /* can be more the one */ 1122dd76986bSJohannes Berg u8 timeout_int_len; 1123dd76986bSJohannes Berg }; 1124dd76986bSJohannes Berg 1125f0706e82SJiri Benc static inline struct ieee80211_local *hw_to_local( 1126f0706e82SJiri Benc struct ieee80211_hw *hw) 1127f0706e82SJiri Benc { 1128f0706e82SJiri Benc return container_of(hw, struct ieee80211_local, hw); 1129f0706e82SJiri Benc } 1130f0706e82SJiri Benc 1131f0706e82SJiri Benc static inline struct ieee80211_hw *local_to_hw( 1132f0706e82SJiri Benc struct ieee80211_local *local) 1133f0706e82SJiri Benc { 1134f0706e82SJiri Benc return &local->hw; 1135f0706e82SJiri Benc } 1136f0706e82SJiri Benc 1137f0706e82SJiri Benc 1138571ecf67SJohannes Berg static inline int ieee80211_bssid_match(const u8 *raddr, const u8 *addr) 1139571ecf67SJohannes Berg { 1140571ecf67SJohannes Berg return compare_ether_addr(raddr, addr) == 0 || 1141571ecf67SJohannes Berg is_broadcast_ether_addr(raddr); 1142571ecf67SJohannes Berg } 1143571ecf67SJohannes Berg 1144571ecf67SJohannes Berg 1145e8975581SJohannes Berg int ieee80211_hw_config(struct ieee80211_local *local, u32 changed); 11465cf121c3SJohannes Berg void ieee80211_tx_set_protected(struct ieee80211_tx_data *tx); 11479c6bd790SJohannes Berg void ieee80211_bss_info_change_notify(struct ieee80211_sub_if_data *sdata, 11489c6bd790SJohannes Berg u32 changed); 11490d143fe1SJohannes Berg void ieee80211_configure_filter(struct ieee80211_local *local); 115046900298SJohannes Berg u32 ieee80211_reset_erp_info(struct ieee80211_sub_if_data *sdata); 1151f0706e82SJiri Benc 115246900298SJohannes Berg /* STA code */ 11539c6bd790SJohannes Berg void ieee80211_sta_setup_sdata(struct ieee80211_sub_if_data *sdata); 115477fdaa12SJohannes Berg int ieee80211_mgd_auth(struct ieee80211_sub_if_data *sdata, 115577fdaa12SJohannes Berg struct cfg80211_auth_request *req); 115677fdaa12SJohannes Berg int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata, 115777fdaa12SJohannes Berg struct cfg80211_assoc_request *req); 115877fdaa12SJohannes Berg int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata, 1159667503ddSJohannes Berg struct cfg80211_deauth_request *req, 1160667503ddSJohannes Berg void *cookie); 116177fdaa12SJohannes Berg int ieee80211_mgd_disassoc(struct ieee80211_sub_if_data *sdata, 1162667503ddSJohannes Berg struct cfg80211_disassoc_request *req, 1163667503ddSJohannes Berg void *cookie); 1164572e0012SKalle Valo void ieee80211_send_pspoll(struct ieee80211_local *local, 1165572e0012SKalle Valo struct ieee80211_sub_if_data *sdata); 116610f644a4SJohannes Berg void ieee80211_recalc_ps(struct ieee80211_local *local, s32 latency); 116710f644a4SJohannes Berg int ieee80211_max_network_latency(struct notifier_block *nb, 116810f644a4SJohannes Berg unsigned long data, void *dummy); 11692b2c009eSJuuso Oikarinen int ieee80211_set_arp_filter(struct ieee80211_sub_if_data *sdata); 1170cc32abd4SJohannes Berg void ieee80211_sta_process_chanswitch(struct ieee80211_sub_if_data *sdata, 1171cc32abd4SJohannes Berg struct ieee80211_channel_sw_ie *sw_elem, 11725ce6e438SJohannes Berg struct ieee80211_bss *bss, 11735ce6e438SJohannes Berg u64 timestamp); 11745bb644a0SJohannes Berg void ieee80211_sta_quiesce(struct ieee80211_sub_if_data *sdata); 11755bb644a0SJohannes Berg void ieee80211_sta_restart(struct ieee80211_sub_if_data *sdata); 11761fa57d01SJohannes Berg void ieee80211_sta_work(struct ieee80211_sub_if_data *sdata); 11771fa57d01SJohannes Berg void ieee80211_sta_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata, 11781fa57d01SJohannes Berg struct sk_buff *skb); 1179d3a910a8SLuis R. Rodriguez void ieee80211_sta_reset_beacon_monitor(struct ieee80211_sub_if_data *sdata); 1180be099e82SLuis R. Rodriguez void ieee80211_sta_reset_conn_monitor(struct ieee80211_sub_if_data *sdata); 118154e4ffb2SJohannes Berg void ieee80211_mgd_teardown(struct ieee80211_sub_if_data *sdata); 11829c6bd790SJohannes Berg 118346900298SJohannes Berg /* IBSS code */ 118446900298SJohannes Berg void ieee80211_ibss_notify_scan_completed(struct ieee80211_local *local); 118546900298SJohannes Berg void ieee80211_ibss_setup_sdata(struct ieee80211_sub_if_data *sdata); 11868bf11d8dSJohannes Berg void ieee80211_ibss_rx_no_sta(struct ieee80211_sub_if_data *sdata, 11878bf11d8dSJohannes Berg const u8 *bssid, const u8 *addr, u32 supp_rates); 1188af8cdcd8SJohannes Berg int ieee80211_ibss_join(struct ieee80211_sub_if_data *sdata, 1189af8cdcd8SJohannes Berg struct cfg80211_ibss_params *params); 1190af8cdcd8SJohannes Berg int ieee80211_ibss_leave(struct ieee80211_sub_if_data *sdata); 11915bb644a0SJohannes Berg void ieee80211_ibss_quiesce(struct ieee80211_sub_if_data *sdata); 11925bb644a0SJohannes Berg void ieee80211_ibss_restart(struct ieee80211_sub_if_data *sdata); 11931fa57d01SJohannes Berg void ieee80211_ibss_work(struct ieee80211_sub_if_data *sdata); 11941fa57d01SJohannes Berg void ieee80211_ibss_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata, 11951fa57d01SJohannes Berg struct sk_buff *skb); 11961fa57d01SJohannes Berg 11971fa57d01SJohannes Berg /* mesh code */ 11981fa57d01SJohannes Berg void ieee80211_mesh_work(struct ieee80211_sub_if_data *sdata); 11991fa57d01SJohannes Berg void ieee80211_mesh_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata, 12001fa57d01SJohannes Berg struct sk_buff *skb); 120146900298SJohannes Berg 12029c6bd790SJohannes Berg /* scan/BSS handling */ 120346900298SJohannes Berg void ieee80211_scan_work(struct work_struct *work); 1204f3b85252SJohannes Berg int ieee80211_request_internal_scan(struct ieee80211_sub_if_data *sdata, 1205be4a4b6aSJohannes Berg const u8 *ssid, u8 ssid_len, 1206be4a4b6aSJohannes Berg struct ieee80211_channel *chan); 1207c2b13452SJohannes Berg int ieee80211_request_scan(struct ieee80211_sub_if_data *sdata, 12082a519311SJohannes Berg struct cfg80211_scan_request *req); 12095bb644a0SJohannes Berg void ieee80211_scan_cancel(struct ieee80211_local *local); 1210c2b13452SJohannes Berg ieee80211_rx_result 1211f1d58c25SJohannes Berg ieee80211_scan_rx(struct ieee80211_sub_if_data *sdata, struct sk_buff *skb); 12129c6bd790SJohannes Berg 12130a51b27eSJohannes Berg void ieee80211_mlme_notify_scan_completed(struct ieee80211_local *local); 1214c2b13452SJohannes Berg struct ieee80211_bss * 121598c8fccfSJohannes Berg ieee80211_bss_info_update(struct ieee80211_local *local, 121698c8fccfSJohannes Berg struct ieee80211_rx_status *rx_status, 121798c8fccfSJohannes Berg struct ieee80211_mgmt *mgmt, 121898c8fccfSJohannes Berg size_t len, 121998c8fccfSJohannes Berg struct ieee802_11_elems *elems, 12202a519311SJohannes Berg struct ieee80211_channel *channel, 12212a519311SJohannes Berg bool beacon); 1222c2b13452SJohannes Berg struct ieee80211_bss * 12235484e237SJohannes Berg ieee80211_rx_bss_get(struct ieee80211_local *local, u8 *bssid, int freq, 12245484e237SJohannes Berg u8 *ssid, u8 ssid_len); 122598c8fccfSJohannes Berg void ieee80211_rx_bss_put(struct ieee80211_local *local, 1226c2b13452SJohannes Berg struct ieee80211_bss *bss); 1227ee385855SLuis Carlos Cobo 122879f460caSLuciano Coelho /* scheduled scan handling */ 122979f460caSLuciano Coelho int ieee80211_request_sched_scan_start(struct ieee80211_sub_if_data *sdata, 123079f460caSLuciano Coelho struct cfg80211_sched_scan_request *req); 123185a9994aSLuciano Coelho int ieee80211_request_sched_scan_stop(struct ieee80211_sub_if_data *sdata); 123285a9994aSLuciano Coelho void ieee80211_sched_scan_stopped_work(struct work_struct *work); 123379f460caSLuciano Coelho 1234b203ffc3SJouni Malinen /* off-channel helpers */ 1235b23b025fSBen Greear void ieee80211_offchannel_stop_vifs(struct ieee80211_local *local, 1236b23b025fSBen Greear bool offchannel_ps_enable); 1237b203ffc3SJouni Malinen void ieee80211_offchannel_return(struct ieee80211_local *local, 1238b23b025fSBen Greear bool offchannel_ps_disable); 123921f83589SJohannes Berg void ieee80211_hw_roc_setup(struct ieee80211_local *local); 1240b203ffc3SJouni Malinen 12413e122be0SJohannes Berg /* interface handling */ 124247846c9bSJohannes Berg int ieee80211_iface_init(void); 124347846c9bSJohannes Berg void ieee80211_iface_exit(void); 12443e122be0SJohannes Berg int ieee80211_if_add(struct ieee80211_local *local, const char *name, 124505c914feSJohannes Berg struct net_device **new_dev, enum nl80211_iftype type, 1246ee385855SLuis Carlos Cobo struct vif_params *params); 1247f3947e2dSJohannes Berg int ieee80211_if_change_type(struct ieee80211_sub_if_data *sdata, 124805c914feSJohannes Berg enum nl80211_iftype type); 1249f698d856SJasper Bryant-Greene void ieee80211_if_remove(struct ieee80211_sub_if_data *sdata); 125075636525SJohannes Berg void ieee80211_remove_interfaces(struct ieee80211_local *local); 12515cff20e6SJohannes Berg u32 __ieee80211_recalc_idle(struct ieee80211_local *local); 12525cff20e6SJohannes Berg void ieee80211_recalc_idle(struct ieee80211_local *local); 125385416a4fSChristian Lamparter void ieee80211_adjust_monitor_flags(struct ieee80211_sub_if_data *sdata, 125485416a4fSChristian Lamparter const int offset); 1255f0706e82SJiri Benc 12569607e6b6SJohannes Berg static inline bool ieee80211_sdata_running(struct ieee80211_sub_if_data *sdata) 12579607e6b6SJohannes Berg { 125834d4bc4dSJohannes Berg return test_bit(SDATA_STATE_RUNNING, &sdata->state); 12599607e6b6SJohannes Berg } 12609607e6b6SJohannes Berg 1261e2ebc74dSJohannes Berg /* tx handling */ 1262e2ebc74dSJohannes Berg void ieee80211_clear_tx_pending(struct ieee80211_local *local); 1263e2ebc74dSJohannes Berg void ieee80211_tx_pending(unsigned long data); 1264d0cf9c0dSStephen Hemminger netdev_tx_t ieee80211_monitor_start_xmit(struct sk_buff *skb, 1265d0cf9c0dSStephen Hemminger struct net_device *dev); 1266d0cf9c0dSStephen Hemminger netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb, 1267d0cf9c0dSStephen Hemminger struct net_device *dev); 1268e2ebc74dSJohannes Berg 1269de1ede7aSJohannes Berg /* HT */ 1270ef96a842SBen Greear bool ieee80111_cfg_override_disables_ht40(struct ieee80211_sub_if_data *sdata); 1271ef96a842SBen Greear void ieee80211_apply_htcap_overrides(struct ieee80211_sub_if_data *sdata, 1272ef96a842SBen Greear struct ieee80211_sta_ht_cap *ht_cap); 1273ef96a842SBen Greear void ieee80211_ht_cap_ie_to_sta_ht_cap(struct ieee80211_sub_if_data *sdata, 1274ef96a842SBen Greear struct ieee80211_supported_band *sband, 1275ae5eb026SJohannes Berg struct ieee80211_ht_cap *ht_cap_ie, 1276d9fe60deSJohannes Berg struct ieee80211_sta_ht_cap *ht_cap); 1277b8695a8fSJohannes Berg void ieee80211_send_delba(struct ieee80211_sub_if_data *sdata, 1278b8695a8fSJohannes Berg const u8 *da, u16 tid, 1279b8695a8fSJohannes Berg u16 initiator, u16 reason_code); 12800f78231bSJohannes Berg int ieee80211_send_smps_action(struct ieee80211_sub_if_data *sdata, 12810f78231bSJohannes Berg enum ieee80211_smps_mode smps, const u8 *da, 12820f78231bSJohannes Berg const u8 *bssid); 1283d1f5b7a3SJohannes Berg void ieee80211_request_smps_work(struct work_struct *work); 1284de1ede7aSJohannes Berg 12857c3b1dd8SJohannes Berg void ___ieee80211_stop_rx_ba_session(struct sta_info *sta, u16 tid, 128653f73c09SJohannes Berg u16 initiator, u16 reason, bool stop); 1287849b7967SJohannes Berg void __ieee80211_stop_rx_ba_session(struct sta_info *sta, u16 tid, 128853f73c09SJohannes Berg u16 initiator, u16 reason, bool stop); 128953f73c09SJohannes Berg void ieee80211_sta_tear_down_BA_sessions(struct sta_info *sta, bool tx); 1290de1ede7aSJohannes Berg void ieee80211_process_delba(struct ieee80211_sub_if_data *sdata, 1291de1ede7aSJohannes Berg struct sta_info *sta, 1292de1ede7aSJohannes Berg struct ieee80211_mgmt *mgmt, size_t len); 1293de1ede7aSJohannes Berg void ieee80211_process_addba_resp(struct ieee80211_local *local, 1294de1ede7aSJohannes Berg struct sta_info *sta, 1295de1ede7aSJohannes Berg struct ieee80211_mgmt *mgmt, 1296de1ede7aSJohannes Berg size_t len); 1297de1ede7aSJohannes Berg void ieee80211_process_addba_request(struct ieee80211_local *local, 1298de1ede7aSJohannes Berg struct sta_info *sta, 1299de1ede7aSJohannes Berg struct ieee80211_mgmt *mgmt, 1300de1ede7aSJohannes Berg size_t len); 1301de1ede7aSJohannes Berg 1302849b7967SJohannes Berg int __ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid, 130353f73c09SJohannes Berg enum ieee80211_back_parties initiator, 130453f73c09SJohannes Berg bool tx); 130567c282c0SJohannes Berg int ___ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid, 130653f73c09SJohannes Berg enum ieee80211_back_parties initiator, 130753f73c09SJohannes Berg bool tx); 13085d22c89bSJohannes Berg void ieee80211_start_tx_ba_cb(struct ieee80211_vif *vif, u8 *ra, u16 tid); 13095d22c89bSJohannes Berg void ieee80211_stop_tx_ba_cb(struct ieee80211_vif *vif, u8 *ra, u8 tid); 131067c282c0SJohannes Berg void ieee80211_ba_session_work(struct work_struct *work); 131167c282c0SJohannes Berg void ieee80211_tx_ba_session_handle_start(struct sta_info *sta, int tid); 13122bff8ebfSChristian Lamparter void ieee80211_release_reorder_timeout(struct sta_info *sta, int tid); 1313849b7967SJohannes Berg 131439192c0bSJohannes Berg /* Spectrum management */ 131539192c0bSJohannes Berg void ieee80211_process_measurement_req(struct ieee80211_sub_if_data *sdata, 131639192c0bSJohannes Berg struct ieee80211_mgmt *mgmt, 131739192c0bSJohannes Berg size_t len); 131839192c0bSJohannes Berg 1319f2753ddbSJohannes Berg /* Suspend/resume and hw reconfiguration */ 1320f2753ddbSJohannes Berg int ieee80211_reconfig(struct ieee80211_local *local); 132184f6a01cSJohannes Berg void ieee80211_stop_device(struct ieee80211_local *local); 1322f2753ddbSJohannes Berg 1323827b1fb4SJohannes Berg #ifdef CONFIG_PM 1324eecc4800SJohannes Berg int __ieee80211_suspend(struct ieee80211_hw *hw, 1325eecc4800SJohannes Berg struct cfg80211_wowlan *wowlan); 1326f2753ddbSJohannes Berg 1327f2753ddbSJohannes Berg static inline int __ieee80211_resume(struct ieee80211_hw *hw) 1328f2753ddbSJohannes Berg { 132985f72bc8SJohn W. Linville struct ieee80211_local *local = hw_to_local(hw); 133085f72bc8SJohn W. Linville 133185f72bc8SJohn W. Linville WARN(test_bit(SCAN_HW_SCANNING, &local->scanning), 133285f72bc8SJohn W. Linville "%s: resume with hardware scan still in progress\n", 133385f72bc8SJohn W. Linville wiphy_name(hw->wiphy)); 133485f72bc8SJohn W. Linville 1335f2753ddbSJohannes Berg return ieee80211_reconfig(hw_to_local(hw)); 1336f2753ddbSJohannes Berg } 1337827b1fb4SJohannes Berg #else 1338eecc4800SJohannes Berg static inline int __ieee80211_suspend(struct ieee80211_hw *hw, 1339eecc4800SJohannes Berg struct cfg80211_wowlan *wowlan) 1340827b1fb4SJohannes Berg { 1341827b1fb4SJohannes Berg return 0; 1342827b1fb4SJohannes Berg } 1343f2753ddbSJohannes Berg 1344827b1fb4SJohannes Berg static inline int __ieee80211_resume(struct ieee80211_hw *hw) 1345827b1fb4SJohannes Berg { 1346827b1fb4SJohannes Berg return 0; 1347827b1fb4SJohannes Berg } 1348827b1fb4SJohannes Berg #endif 1349665af4fcSBob Copeland 1350c2d1560aSJohannes Berg /* utility functions/constants */ 1351c2d1560aSJohannes Berg extern void *mac80211_wiphy_privid; /* for wiphy privid */ 135271364716SRon Rindjunsky u8 *ieee80211_get_bssid(struct ieee80211_hdr *hdr, size_t len, 135305c914feSJohannes Berg enum nl80211_iftype type); 1354c2d1560aSJohannes Berg int ieee80211_frame_duration(struct ieee80211_local *local, size_t len, 1355c2d1560aSJohannes Berg int rate, int erp, int short_preamble); 1356f698d856SJasper Bryant-Greene void mac80211_ev_michael_mic_failure(struct ieee80211_sub_if_data *sdata, int keyidx, 1357e6d6e342SJohannes Berg struct ieee80211_hdr *hdr, const u8 *tsc, 1358e6d6e342SJohannes Berg gfp_t gfp); 13595825fe10SJohannes Berg void ieee80211_set_wmm_default(struct ieee80211_sub_if_data *sdata); 1360ce662b44SJohannes Berg void ieee80211_xmit(struct ieee80211_sub_if_data *sdata, struct sk_buff *skb); 1361cf6bb79aSHelmut Schaa 1362cf6bb79aSHelmut Schaa void ieee80211_tx_skb_tid(struct ieee80211_sub_if_data *sdata, 1363cf6bb79aSHelmut Schaa struct sk_buff *skb, int tid); 1364cf6bb79aSHelmut Schaa static void inline ieee80211_tx_skb(struct ieee80211_sub_if_data *sdata, 1365cf6bb79aSHelmut Schaa struct sk_buff *skb) 1366cf6bb79aSHelmut Schaa { 1367cf6bb79aSHelmut Schaa /* Send all internal mgmt frames on VO. Accordingly set TID to 7. */ 1368cf6bb79aSHelmut Schaa ieee80211_tx_skb_tid(sdata, skb, 7); 1369cf6bb79aSHelmut Schaa } 1370cf6bb79aSHelmut Schaa 13719c6bd790SJohannes Berg void ieee802_11_parse_elems(u8 *start, size_t len, 13729c6bd790SJohannes Berg struct ieee802_11_elems *elems); 1373d91f36dbSJohannes Berg u32 ieee802_11_parse_elems_crc(u8 *start, size_t len, 1374d91f36dbSJohannes Berg struct ieee802_11_elems *elems, 1375d91f36dbSJohannes Berg u64 filter, u32 crc); 1376881d948cSJohannes Berg u32 ieee80211_mandatory_rates(struct ieee80211_local *local, 137796dd22acSJohannes Berg enum ieee80211_band band); 1378f0706e82SJiri Benc 1379520eb820SKalle Valo void ieee80211_dynamic_ps_enable_work(struct work_struct *work); 1380520eb820SKalle Valo void ieee80211_dynamic_ps_disable_work(struct work_struct *work); 1381520eb820SKalle Valo void ieee80211_dynamic_ps_timer(unsigned long data); 1382a97b77b9SVivek Natarajan void ieee80211_send_nullfunc(struct ieee80211_local *local, 1383a97b77b9SVivek Natarajan struct ieee80211_sub_if_data *sdata, 1384a97b77b9SVivek Natarajan int powersave); 13853cf335d5SKalle Valo void ieee80211_sta_rx_notify(struct ieee80211_sub_if_data *sdata, 13863cf335d5SKalle Valo struct ieee80211_hdr *hdr); 13874e5ff376SFelix Fietkau void ieee80211_sta_tx_notify(struct ieee80211_sub_if_data *sdata, 138804ac3c0eSFelix Fietkau struct ieee80211_hdr *hdr, bool ack); 13891e4dcd01SJuuso Oikarinen void ieee80211_beacon_connection_loss_work(struct work_struct *work); 1390520eb820SKalle Valo 1391ce7c9111SKalle Valo void ieee80211_wake_queues_by_reason(struct ieee80211_hw *hw, 1392ce7c9111SKalle Valo enum queue_stop_reason reason); 1393ce7c9111SKalle Valo void ieee80211_stop_queues_by_reason(struct ieee80211_hw *hw, 1394ce7c9111SKalle Valo enum queue_stop_reason reason); 139596f5e66eSJohannes Berg void ieee80211_wake_queue_by_reason(struct ieee80211_hw *hw, int queue, 139696f5e66eSJohannes Berg enum queue_stop_reason reason); 139796f5e66eSJohannes Berg void ieee80211_stop_queue_by_reason(struct ieee80211_hw *hw, int queue, 139896f5e66eSJohannes Berg enum queue_stop_reason reason); 13998f77f384SJohannes Berg void ieee80211_add_pending_skb(struct ieee80211_local *local, 14008f77f384SJohannes Berg struct sk_buff *skb); 1401b0b97a8aSJohannes Berg void ieee80211_add_pending_skbs(struct ieee80211_local *local, 14028f77f384SJohannes Berg struct sk_buff_head *skbs); 1403b0b97a8aSJohannes Berg void ieee80211_add_pending_skbs_fn(struct ieee80211_local *local, 140450a9432dSJohannes Berg struct sk_buff_head *skbs, 140550a9432dSJohannes Berg void (*fn)(void *data), void *data); 1406ce7c9111SKalle Valo 140746900298SJohannes Berg void ieee80211_send_auth(struct ieee80211_sub_if_data *sdata, 140846900298SJohannes Berg u16 transaction, u16 auth_alg, 1409fffd0934SJohannes Berg u8 *extra, size_t extra_len, const u8 *bssid, 1410efa6a09dSAntonio Quartulli const u8 *da, const u8 *key, u8 key_len, u8 key_idx); 1411de95a54bSJohannes Berg int ieee80211_build_preq_ies(struct ieee80211_local *local, u8 *buffer, 14124d36ec58SJohannes Berg const u8 *ie, size_t ie_len, 1413651b5225SJouni Malinen enum ieee80211_band band, u32 rate_mask, 1414651b5225SJouni Malinen u8 channel); 1415a619a4c0SJuuso Oikarinen struct sk_buff *ieee80211_build_probe_req(struct ieee80211_sub_if_data *sdata, 141685a237feSJohannes Berg u8 *dst, u32 ratemask, 1417a619a4c0SJuuso Oikarinen const u8 *ssid, size_t ssid_len, 1418a806c558SPaul Stewart const u8 *ie, size_t ie_len, 1419a806c558SPaul Stewart bool directed); 142046900298SJohannes Berg void ieee80211_send_probe_req(struct ieee80211_sub_if_data *sdata, u8 *dst, 1421de95a54bSJohannes Berg const u8 *ssid, size_t ssid_len, 1422a806c558SPaul Stewart const u8 *ie, size_t ie_len, 1423aad14cebSRajkumar Manoharan u32 ratemask, bool directed, bool no_cck); 142446900298SJohannes Berg 142546900298SJohannes Berg void ieee80211_sta_def_wmm_params(struct ieee80211_sub_if_data *sdata, 142646900298SJohannes Berg const size_t supp_rates_len, 142746900298SJohannes Berg const u8 *supp_rates); 142846900298SJohannes Berg u32 ieee80211_sta_get_rates(struct ieee80211_local *local, 142946900298SJohannes Berg struct ieee802_11_elems *elems, 143046900298SJohannes Berg enum ieee80211_band band); 14310f78231bSJohannes Berg int __ieee80211_request_smps(struct ieee80211_sub_if_data *sdata, 14320f78231bSJohannes Berg enum ieee80211_smps_mode smps_mode); 1433025e6be2SJohannes Berg void ieee80211_recalc_smps(struct ieee80211_local *local); 143446900298SJohannes Berg 14358e664fb3SJohannes Berg size_t ieee80211_ie_split(const u8 *ies, size_t ielen, 14368e664fb3SJohannes Berg const u8 *ids, int n_ids, size_t offset); 14378e664fb3SJohannes Berg size_t ieee80211_ie_split_vendor(const u8 *ies, size_t ielen, size_t offset); 1438ef96a842SBen Greear u8 *ieee80211_ie_build_ht_cap(u8 *pos, struct ieee80211_sta_ht_cap *ht_cap, 143942e7aa77SAlexander Simon u16 cap); 144042e7aa77SAlexander Simon u8 *ieee80211_ie_build_ht_info(u8 *pos, 144142e7aa77SAlexander Simon struct ieee80211_sta_ht_cap *ht_cap, 144242e7aa77SAlexander Simon struct ieee80211_channel *channel, 144342e7aa77SAlexander Simon enum nl80211_channel_type channel_type); 14448e664fb3SJohannes Berg 1445af6b6374SJohannes Berg /* internal work items */ 1446af6b6374SJohannes Berg void ieee80211_work_init(struct ieee80211_local *local); 1447af6b6374SJohannes Berg void ieee80211_add_work(struct ieee80211_work *wk); 1448af6b6374SJohannes Berg void free_work(struct ieee80211_work *wk); 1449af6b6374SJohannes Berg void ieee80211_work_purge(struct ieee80211_sub_if_data *sdata); 1450b8bc4b0aSJohannes Berg int ieee80211_wk_remain_on_channel(struct ieee80211_sub_if_data *sdata, 1451b8bc4b0aSJohannes Berg struct ieee80211_channel *chan, 1452b8bc4b0aSJohannes Berg enum nl80211_channel_type channel_type, 1453b8bc4b0aSJohannes Berg unsigned int duration, u64 *cookie); 1454b8bc4b0aSJohannes Berg int ieee80211_wk_cancel_remain_on_channel( 1455b8bc4b0aSJohannes Berg struct ieee80211_sub_if_data *sdata, u64 cookie); 1456af6b6374SJohannes Berg 1457f444de05SJohannes Berg /* channel management */ 1458f444de05SJohannes Berg enum ieee80211_chan_mode { 1459f444de05SJohannes Berg CHAN_MODE_UNDEFINED, 1460f444de05SJohannes Berg CHAN_MODE_HOPPING, 1461f444de05SJohannes Berg CHAN_MODE_FIXED, 1462f444de05SJohannes Berg }; 1463f444de05SJohannes Berg 1464f444de05SJohannes Berg enum ieee80211_chan_mode 1465f444de05SJohannes Berg ieee80211_get_channel_mode(struct ieee80211_local *local, 1466f444de05SJohannes Berg struct ieee80211_sub_if_data *ignore); 14670aaffa9bSJohannes Berg bool ieee80211_set_channel_type(struct ieee80211_local *local, 14680aaffa9bSJohannes Berg struct ieee80211_sub_if_data *sdata, 14690aaffa9bSJohannes Berg enum nl80211_channel_type chantype); 147042e7aa77SAlexander Simon enum nl80211_channel_type 147142e7aa77SAlexander Simon ieee80211_ht_info_to_channel_type(struct ieee80211_ht_info *ht_info); 1472f444de05SJohannes Berg 1473f4ea83ddSJohannes Berg #ifdef CONFIG_MAC80211_NOINLINE 1474d9e8a70fSJohannes Berg #define debug_noinline noinline 1475d9e8a70fSJohannes Berg #else 1476d9e8a70fSJohannes Berg #define debug_noinline 1477d9e8a70fSJohannes Berg #endif 1478d9e8a70fSJohannes Berg 1479f0706e82SJiri Benc #endif /* IEEE80211_I_H */ 1480