Path: blob/main/sys/compat/linuxkpi/common/src/linux_80211.h
39586 views
/*-1* Copyright (c) 2020-2023 The FreeBSD Foundation2* Copyright (c) 2020-2021 Bjoern A. Zeeb3*4* This software was developed by Björn Zeeb under sponsorship from5* the FreeBSD Foundation.6*7* Redistribution and use in source and binary forms, with or without8* modification, are permitted provided that the following conditions9* are met:10* 1. Redistributions of source code must retain the above copyright11* notice, this list of conditions and the following disclaimer.12* 2. Redistributions in binary form must reproduce the above copyright13* notice, this list of conditions and the following disclaimer in the14* documentation and/or other materials provided with the distribution.15*16* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND17* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE18* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE19* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE20* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL21* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS22* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)23* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT24* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY25* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF26* SUCH DAMAGE.27*/2829/*30* Public functions are called linuxkpi_*().31* Internal (static) functions are called lkpi_*().32*33* The internal structures holding metadata over public structures are also34* called lkpi_xxx (usually with a member at the end called xxx).35* Note: we do not replicate the structure names but the general variable names36* for these (e.g., struct hw -> struct lkpi_hw, struct sta -> struct lkpi_sta).37* There are macros to access one from the other.38* We call the internal versions lxxx (e.g., hw -> lhw, sta -> lsta).39*/4041#ifndef _LKPI_SRC_LINUX_80211_H42#define _LKPI_SRC_LINUX_80211_H4344#include "opt_wlan.h"4546#if defined(IEEE80211_DEBUG) && !defined(LINUXKPI_DEBUG_80211)47#define LINUXKPI_DEBUG_8021148#endif4950/* #define LINUXKPI_DEBUG_80211 */5152#ifndef D80211_TODO53#define D80211_TODO 0x0000000154#endif55#ifndef D80211_IMPROVE56#define D80211_IMPROVE 0x0000000257#endif58#define D80211_IMPROVE_TXQ 0x0000000459#define D80211_TRACE 0x0000001060#define D80211_TRACEOK 0x0000002061#define D80211_SCAN 0x0000004062#define D80211_SCAN_BEACON 0x0000008063#define D80211_TRACE_TX 0x0000010064#define D80211_TRACE_TX_DUMP 0x0000020065#define D80211_TRACE_RX 0x0000100066#define D80211_TRACE_RX_DUMP 0x0000200067#define D80211_TRACE_RX_BEACONS 0x0000400068#define D80211_TRACEX (D80211_TRACE_TX|D80211_TRACE_RX)69#define D80211_TRACEX_DUMP (D80211_TRACE_TX_DUMP|D80211_TRACE_RX_DUMP)70#define D80211_TRACE_STA 0x0001000071#define D80211_TRACE_HW_CRYPTO 0x0002000072#define D80211_TRACE_MO 0x0010000073#define D80211_TRACE_MODE 0x0f00000074#define D80211_TRACE_MODE_HT 0x0100000075#define D80211_TRACE_MODE_VHT 0x0200000076#define D80211_TRACE_MODE_HE 0x0400000077#define D80211_TRACE_MODE_EHT 0x080000007879#ifdef LINUXKPI_DEBUG_8021180#define TRACE_SCAN(ic, fmt, ...) \81if (linuxkpi_debug_80211 & D80211_SCAN) \82printf("%s:%d: %s SCAN " fmt "\n", \83__func__, __LINE__, ic->ic_name, ##__VA_ARGS__)84#define TRACE_SCAN_BEACON(ic, fmt, ...) \85if (linuxkpi_debug_80211 & D80211_SCAN_BEACON) \86printf("%s:%d: %s SCAN " fmt "\n", \87__func__, __LINE__, ic->ic_name, ##__VA_ARGS__)88#else89#define TRACE_SCAN(...) do {} while (0)90#define TRACE_SCAN_BEACON(...) do {} while (0)91#endif9293#define IMPROVE_TXQ(...) \94if (linuxkpi_debug_80211 & D80211_IMPROVE_TXQ) \95printf("%s:%d: XXX LKPI80211 IMPROVE_TXQ\n", __func__, __LINE__)9697#define IMPROVE_HT(fmt, ...) \98if (linuxkpi_debug_80211 & D80211_TRACE_MODE_HT) \99printf("%s:%d: XXX LKPI80211 IMPROVE_HT " fmt "\n", \100__func__, __LINE__, ##__VA_ARGS__);101102#define MTAG_ABI_LKPI80211 1707696513 /* LinuxKPI 802.11 KBI */103104#ifdef LKPI_80211_USE_MTAG105/*106* Deferred RX path.107* We need to pass *ni along (and possibly more in the future so108* we use a struct right from the start.109*/110#define LKPI80211_TAG_RXNI 0 /* deferred RX path */111struct lkpi_80211_tag_rxni {112struct ieee80211_node *ni; /* MUST hold a reference to it. */113};114#endif115116struct lkpi_radiotap_tx_hdr {117struct ieee80211_radiotap_header wt_ihdr;118uint8_t wt_flags;119uint8_t wt_rate;120uint16_t wt_chan_freq;121uint16_t wt_chan_flags;122} __packed;123#define LKPI_RTAP_TX_FLAGS_PRESENT \124((1 << IEEE80211_RADIOTAP_FLAGS) | \125(1 << IEEE80211_RADIOTAP_RATE) | \126(1 << IEEE80211_RADIOTAP_CHANNEL))127128struct lkpi_radiotap_rx_hdr {129struct ieee80211_radiotap_header wr_ihdr;130uint64_t wr_tsft;131uint8_t wr_flags;132uint8_t wr_rate;133uint16_t wr_chan_freq;134uint16_t wr_chan_flags;135int8_t wr_dbm_antsignal;136int8_t wr_dbm_antnoise;137} __packed __aligned(8);138#define LKPI_RTAP_RX_FLAGS_PRESENT \139((1 << IEEE80211_RADIOTAP_TSFT) | \140(1 << IEEE80211_RADIOTAP_FLAGS) | \141(1 << IEEE80211_RADIOTAP_RATE) | \142(1 << IEEE80211_RADIOTAP_CHANNEL) | \143(1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) | \144(1 << IEEE80211_RADIOTAP_DBM_ANTNOISE))145146struct lkpi_hw;147148struct lkpi_txq {149TAILQ_ENTRY(lkpi_txq) txq_entry;150151struct mtx ltxq_mtx;152bool seen_dequeue;153bool stopped;154uint32_t txq_generation;155struct sk_buff_head skbq;156157/* Must be last! */158struct ieee80211_txq txq __aligned(CACHE_LINE_SIZE);159};160#define TXQ_TO_LTXQ(_txq) container_of(_txq, struct lkpi_txq, txq)161162163struct lkpi_sta {164struct list_head lsta_list;165struct ieee80211_node *ni;166struct ieee80211_hw *hw; /* back pointer f. locking. */167168/* Deferred TX path. */169/* Eventually we might want to migrate this into net80211 entirely. */170/* XXX-BZ can we use sta->txq[] instead directly? */171struct task txq_task;172struct mbufq txq;173struct mtx txq_mtx;174175struct ieee80211_key_conf *kc[IEEE80211_WEP_NKID];176enum ieee80211_sta_state state;177bool txq_ready; /* Can we run the taskq? */178bool added_to_drv; /* Driver knows; i.e. we called ...(). */179bool in_mgd; /* XXX-BZ should this be per-vif? */180181struct station_info sinfo; /* statistics */182183/* Must be last! */184struct ieee80211_sta sta __aligned(CACHE_LINE_SIZE);185};186#define STA_TO_LSTA(_sta) container_of(_sta, struct lkpi_sta, sta)187#define LSTA_TO_STA(_lsta) (&(_lsta)->sta)188189/* Either protected by wiphy lock or rcu for the list. */190struct lkpi_vif {191TAILQ_ENTRY(lkpi_vif) lvif_entry;192struct ieee80211vap iv_vap;193eventhandler_tag lvif_ifllevent;194195struct sysctl_ctx_list sysctl_ctx;196197struct mtx mtx;198struct wireless_dev wdev;199200/* Other local stuff. */201int (*iv_newstate)(struct ieee80211vap *,202enum ieee80211_state, int);203struct ieee80211_node * (*iv_update_bss)(struct ieee80211vap *,204struct ieee80211_node *);205void (*iv_recv_mgmt)(struct ieee80211_node *,206struct mbuf *, int,207const struct ieee80211_rx_stats *,208int, int);209struct task sw_scan_task;210211struct list_head lsta_list;212213struct lkpi_sta *lvif_bss;214215struct ieee80211_node *key_update_iv_bss;216int ic_unlocked; /* Count of ic unlocks pending (*mo_set_key) */217int nt_unlocked; /* Count of nt unlocks pending (*mo_set_key) */218int beacons; /* # of beacons since assoc */219bool lvif_bss_synched;220bool added_to_drv; /* Driver knows; i.e. we called add_interface(). */221222bool hw_queue_stopped[IEEE80211_NUM_ACS];223224/* Must be last! */225struct ieee80211_vif vif __aligned(CACHE_LINE_SIZE);226};227#define VAP_TO_LVIF(_vap) container_of(_vap, struct lkpi_vif, iv_vap)228#define LVIF_TO_VAP(_lvif) (&(_lvif)->iv_vap)229#define VIF_TO_LVIF(_vif) container_of(_vif, struct lkpi_vif, vif)230#define LVIF_TO_VIF(_lvif) (&(_lvif)->vif)231232233struct lkpi_hw { /* name it mac80211_sc? */234const struct ieee80211_ops *ops;235struct ieee80211_scan_request *hw_req;236struct workqueue_struct *workq;237238/* FreeBSD specific compat. */239/* Linux device is in hw.wiphy->dev after SET_IEEE80211_DEV(). */240struct ieee80211com *ic;241struct lkpi_radiotap_tx_hdr rtap_tx;242struct lkpi_radiotap_rx_hdr rtap_rx;243244TAILQ_HEAD(, lkpi_vif) lvif_head;245struct sx lvif_sx;246247struct list_head lchanctx_list;248struct netdev_hw_addr_list mc_list;249unsigned int mc_flags;250struct sx mc_sx;251252struct mtx txq_mtx;253uint32_t txq_generation[IEEE80211_NUM_ACS];254TAILQ_HEAD(, lkpi_txq) scheduled_txqs[IEEE80211_NUM_ACS];255spinlock_t txq_lock;256257/* Deferred RX path. */258struct task rxq_task;259struct mbufq rxq;260struct mtx rxq_mtx;261262/* Scan functions we overload to handle depending on scan mode. */263void (*ic_scan_curchan)(struct ieee80211_scan_state *,264unsigned long);265void (*ic_scan_mindwell)(struct ieee80211_scan_state *);266267/* Node functions we overload to sync state. */268struct ieee80211_node * (*ic_node_alloc)(struct ieee80211vap *,269const uint8_t [IEEE80211_ADDR_LEN]);270int (*ic_node_init)(struct ieee80211_node *);271void (*ic_node_cleanup)(struct ieee80211_node *);272void (*ic_node_free)(struct ieee80211_node *);273274/* HT and later functions. */275int (*ic_recv_action)(struct ieee80211_node *,276const struct ieee80211_frame *,277const uint8_t *, const uint8_t *);278int (*ic_send_action)(struct ieee80211_node *,279int, int, void *);280int (*ic_ampdu_enable)(struct ieee80211_node *,281struct ieee80211_tx_ampdu *);282int (*ic_addba_request)(struct ieee80211_node *,283struct ieee80211_tx_ampdu *, int, int, int);284int (*ic_addba_response)(struct ieee80211_node *,285struct ieee80211_tx_ampdu *, int, int, int);286void (*ic_addba_stop)(struct ieee80211_node *,287struct ieee80211_tx_ampdu *);288void (*ic_addba_response_timeout)(struct ieee80211_node *,289struct ieee80211_tx_ampdu *);290void (*ic_bar_response)(struct ieee80211_node *,291struct ieee80211_tx_ampdu *, int);292int (*ic_ampdu_rx_start)(struct ieee80211_node *,293struct ieee80211_rx_ampdu *, int, int, int);294void (*ic_ampdu_rx_stop)(struct ieee80211_node *,295struct ieee80211_rx_ampdu *);296297#define LKPI_MAC80211_DRV_STARTED 0x00000001298uint32_t sc_flags;299#define LKPI_LHW_SCAN_RUNNING 0x00000001300#define LKPI_LHW_SCAN_HW 0x00000002301uint32_t scan_flags;302struct mtx scan_mtx;303304int supbands; /* Number of supported bands. */305int max_rates; /* Maximum number of bitrates supported in any channel. */306int scan_ie_len; /* Length of common per-band scan IEs. */307308bool mc_all_multi;309bool update_wme;310bool rxq_stopped;311312/* Must be last! */313struct ieee80211_hw hw __aligned(CACHE_LINE_SIZE);314};315#define LHW_TO_HW(_lhw) (&(_lhw)->hw)316#define HW_TO_LHW(_hw) container_of(_hw, struct lkpi_hw, hw)317318#define LKPI_LHW_SCAN_BITS \319"\010\1RUNING\2HW"320321struct lkpi_chanctx {322struct list_head entry;323324bool added_to_drv; /* Managed by MO */325326struct ieee80211_chanctx_conf chanctx_conf __aligned(CACHE_LINE_SIZE);327};328#define LCHANCTX_TO_CHANCTX_CONF(_lchanctx) \329(&(_lchanctx)->chanctx_conf)330#define CHANCTX_CONF_TO_LCHANCTX(_conf) \331container_of(_conf, struct lkpi_chanctx, chanctx_conf)332333struct lkpi_wiphy {334const struct cfg80211_ops *ops;335336struct work_struct wwk;337struct list_head wwk_list;338struct mtx wwk_mtx;339340/* Must be last! */341struct wiphy wiphy __aligned(CACHE_LINE_SIZE);342};343#define WIPHY_TO_LWIPHY(_wiphy) container_of(_wiphy, struct lkpi_wiphy, wiphy)344#define LWIPHY_TO_WIPHY(_lwiphy) (&(_lwiphy)->wiphy)345346#define LKPI_80211_LWIPHY_WORK_LOCK_INIT(_lwiphy) \347mtx_init(&(_lwiphy)->wwk_mtx, "lwiphy-work", NULL, MTX_DEF);348#define LKPI_80211_LWIPHY_WORK_LOCK_DESTROY(_lwiphy) \349mtx_destroy(&(_lwiphy)->wwk_mtx)350#define LKPI_80211_LWIPHY_WORK_LOCK(_lwiphy) \351mtx_lock(&(_lwiphy)->wwk_mtx)352#define LKPI_80211_LWIPHY_WORK_UNLOCK(_lwiphy) \353mtx_unlock(&(_lwiphy)->wwk_mtx)354#define LKPI_80211_LWIPHY_WORK_LOCK_ASSERT(_lwiphy) \355mtx_assert(&(_lwiphy)->wwk_mtx, MA_OWNED)356#define LKPI_80211_LWIPHY_WORK_UNLOCK_ASSERT(_lwiphy) \357mtx_assert(&(_lwiphy)->wwk_mtx, MA_NOTOWNED)358359#define LKPI_80211_LHW_SCAN_LOCK_INIT(_lhw) \360mtx_init(&(_lhw)->scan_mtx, "lhw-scan", NULL, MTX_DEF | MTX_RECURSE);361#define LKPI_80211_LHW_SCAN_LOCK_DESTROY(_lhw) \362mtx_destroy(&(_lhw)->scan_mtx);363#define LKPI_80211_LHW_SCAN_LOCK(_lhw) \364mtx_lock(&(_lhw)->scan_mtx)365#define LKPI_80211_LHW_SCAN_UNLOCK(_lhw) \366mtx_unlock(&(_lhw)->scan_mtx)367#define LKPI_80211_LHW_SCAN_LOCK_ASSERT(_lhw) \368mtx_assert(&(_lhw)->scan_mtx, MA_OWNED)369#define LKPI_80211_LHW_SCAN_UNLOCK_ASSERT(_lhw) \370mtx_assert(&(_lhw)->scan_mtx, MA_NOTOWNED)371372#define LKPI_80211_LHW_TXQ_LOCK_INIT(_lhw) \373mtx_init(&(_lhw)->txq_mtx, "lhw-txq", NULL, MTX_DEF | MTX_RECURSE);374#define LKPI_80211_LHW_TXQ_LOCK_DESTROY(_lhw) \375mtx_destroy(&(_lhw)->txq_mtx);376#define LKPI_80211_LHW_TXQ_LOCK(_lhw) \377mtx_lock(&(_lhw)->txq_mtx)378#define LKPI_80211_LHW_TXQ_UNLOCK(_lhw) \379mtx_unlock(&(_lhw)->txq_mtx)380#define LKPI_80211_LHW_TXQ_LOCK_ASSERT(_lhw) \381mtx_assert(&(_lhw)->txq_mtx, MA_OWNED)382#define LKPI_80211_LHW_TXQ_UNLOCK_ASSERT(_lhw) \383mtx_assert(&(_lhw)->txq_mtx, MA_NOTOWNED)384385#define LKPI_80211_LHW_RXQ_LOCK_INIT(_lhw) \386mtx_init(&(_lhw)->rxq_mtx, "lhw-rxq", NULL, MTX_DEF | MTX_RECURSE);387#define LKPI_80211_LHW_RXQ_LOCK_DESTROY(_lhw) \388mtx_destroy(&(_lhw)->rxq_mtx);389#define LKPI_80211_LHW_RXQ_LOCK(_lhw) \390mtx_lock(&(_lhw)->rxq_mtx)391#define LKPI_80211_LHW_RXQ_UNLOCK(_lhw) \392mtx_unlock(&(_lhw)->rxq_mtx)393#define LKPI_80211_LHW_RXQ_LOCK_ASSERT(_lhw) \394mtx_assert(&(_lhw)->rxq_mtx, MA_OWNED)395#define LKPI_80211_LHW_RXQ_UNLOCK_ASSERT(_lhw) \396mtx_assert(&(_lhw)->rxq_mtx, MA_NOTOWNED)397398#define LKPI_80211_LHW_LVIF_LOCK(_lhw) sx_xlock(&(_lhw)->lvif_sx)399#define LKPI_80211_LHW_LVIF_UNLOCK(_lhw) sx_xunlock(&(_lhw)->lvif_sx)400401#define LKPI_80211_LHW_MC_LOCK_INIT(_lhw) \402sx_init_flags(&lhw->mc_sx, "lhw-mc", 0);403#define LKPI_80211_LHW_MC_LOCK_DESTROY(_lhw) \404sx_destroy(&lhw->mc_sx);405#define LKPI_80211_LHW_MC_LOCK(_lhw) sx_xlock(&(_lhw)->mc_sx)406#define LKPI_80211_LHW_MC_UNLOCK(_lhw) sx_xunlock(&(_lhw)->mc_sx)407408#define LKPI_80211_LVIF_LOCK(_lvif) mtx_lock(&(_lvif)->mtx)409#define LKPI_80211_LVIF_UNLOCK(_lvif) mtx_unlock(&(_lvif)->mtx)410411#define LKPI_80211_LSTA_TXQ_LOCK_INIT(_lsta) \412mtx_init(&(_lsta)->txq_mtx, "lsta-txq", NULL, MTX_DEF);413#define LKPI_80211_LSTA_TXQ_LOCK_DESTROY(_lsta) \414mtx_destroy(&(_lsta)->txq_mtx);415#define LKPI_80211_LSTA_TXQ_LOCK(_lsta) \416mtx_lock(&(_lsta)->txq_mtx)417#define LKPI_80211_LSTA_TXQ_UNLOCK(_lsta) \418mtx_unlock(&(_lsta)->txq_mtx)419#define LKPI_80211_LSTA_TXQ_LOCK_ASSERT(_lsta) \420mtx_assert(&(_lsta)->txq_mtx, MA_OWNED)421#define LKPI_80211_LSTA_TXQ_UNLOCK_ASSERT(_lsta) \422mtx_assert(&(_lsta)->txq_mtx, MA_NOTOWNED)423424#define LKPI_80211_LTXQ_LOCK_INIT(_ltxq) \425mtx_init(&(_ltxq)->ltxq_mtx, "ltxq", NULL, MTX_DEF);426#define LKPI_80211_LTXQ_LOCK_DESTROY(_ltxq) \427mtx_destroy(&(_ltxq)->ltxq_mtx);428#define LKPI_80211_LTXQ_LOCK(_ltxq) \429mtx_lock(&(_ltxq)->ltxq_mtx)430#define LKPI_80211_LTXQ_UNLOCK(_ltxq) \431mtx_unlock(&(_ltxq)->ltxq_mtx)432#define LKPI_80211_LTXQ_LOCK_ASSERT(_ltxq) \433mtx_assert(&(_ltxq)->ltxq_mtx, MA_OWNED)434#define LKPI_80211_LTXQ_UNLOCK_ASSERT(_ltxq) \435mtx_assert(&(_ltxq)->ltxq_mtx, MA_NOTOWNED)436437int lkpi_80211_mo_start(struct ieee80211_hw *);438void lkpi_80211_mo_stop(struct ieee80211_hw *, bool);439int lkpi_80211_mo_get_antenna(struct ieee80211_hw *, u32 *, u32 *);440int lkpi_80211_mo_set_frag_threshold(struct ieee80211_hw *, uint32_t);441int lkpi_80211_mo_set_rts_threshold(struct ieee80211_hw *, uint32_t);442int lkpi_80211_mo_add_interface(struct ieee80211_hw *, struct ieee80211_vif *);443void lkpi_80211_mo_remove_interface(struct ieee80211_hw *, struct ieee80211_vif *);444int lkpi_80211_mo_hw_scan(struct ieee80211_hw *, struct ieee80211_vif *,445struct ieee80211_scan_request *);446void lkpi_80211_mo_cancel_hw_scan(struct ieee80211_hw *, struct ieee80211_vif *);447void lkpi_80211_mo_sw_scan_complete(struct ieee80211_hw *, struct ieee80211_vif *);448void lkpi_80211_mo_sw_scan_start(struct ieee80211_hw *, struct ieee80211_vif *,449const u8 *);450u64 lkpi_80211_mo_prepare_multicast(struct ieee80211_hw *,451struct netdev_hw_addr_list *);452void lkpi_80211_mo_configure_filter(struct ieee80211_hw *, unsigned int,453unsigned int *, u64);454int lkpi_80211_mo_sta_state(struct ieee80211_hw *, struct ieee80211_vif *,455struct lkpi_sta *, enum ieee80211_sta_state);456int lkpi_80211_mo_config(struct ieee80211_hw *, uint32_t);457int lkpi_80211_mo_assign_vif_chanctx(struct ieee80211_hw *, struct ieee80211_vif *,458struct ieee80211_bss_conf *, struct ieee80211_chanctx_conf *);459void lkpi_80211_mo_unassign_vif_chanctx(struct ieee80211_hw *, struct ieee80211_vif *,460struct ieee80211_bss_conf *, struct ieee80211_chanctx_conf *);461int lkpi_80211_mo_add_chanctx(struct ieee80211_hw *, struct ieee80211_chanctx_conf *);462void lkpi_80211_mo_change_chanctx(struct ieee80211_hw *,463struct ieee80211_chanctx_conf *, uint32_t);464void lkpi_80211_mo_remove_chanctx(struct ieee80211_hw *,465struct ieee80211_chanctx_conf *);466void lkpi_80211_mo_bss_info_changed(struct ieee80211_hw *, struct ieee80211_vif *,467struct ieee80211_bss_conf *, uint64_t);468int lkpi_80211_mo_conf_tx(struct ieee80211_hw *, struct ieee80211_vif *,469uint32_t, uint16_t, const struct ieee80211_tx_queue_params *);470void lkpi_80211_mo_flush(struct ieee80211_hw *, struct ieee80211_vif *,471uint32_t, bool);472void lkpi_80211_mo_mgd_prepare_tx(struct ieee80211_hw *, struct ieee80211_vif *,473struct ieee80211_prep_tx_info *);474void lkpi_80211_mo_mgd_complete_tx(struct ieee80211_hw *, struct ieee80211_vif *,475struct ieee80211_prep_tx_info *);476void lkpi_80211_mo_tx(struct ieee80211_hw *, struct ieee80211_tx_control *,477struct sk_buff *);478void lkpi_80211_mo_wake_tx_queue(struct ieee80211_hw *, struct ieee80211_txq *);479void lkpi_80211_mo_sync_rx_queues(struct ieee80211_hw *);480void lkpi_80211_mo_sta_pre_rcu_remove(struct ieee80211_hw *,481struct ieee80211_vif *, struct ieee80211_sta *);482int lkpi_80211_mo_set_key(struct ieee80211_hw *, enum set_key_cmd,483struct ieee80211_vif *, struct ieee80211_sta *,484struct ieee80211_key_conf *);485int lkpi_80211_mo_ampdu_action(struct ieee80211_hw *, struct ieee80211_vif *,486struct ieee80211_ampdu_params *);487int lkpi_80211_mo_sta_statistics(struct ieee80211_hw *, struct ieee80211_vif *,488struct ieee80211_sta *, struct station_info *);489490#endif /* _LKPI_SRC_LINUX_80211_H */491492493