Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/compat/linuxkpi/common/src/linux_80211.h
39586 views
1
/*-
2
* Copyright (c) 2020-2023 The FreeBSD Foundation
3
* Copyright (c) 2020-2021 Bjoern A. Zeeb
4
*
5
* This software was developed by Björn Zeeb under sponsorship from
6
* the FreeBSD Foundation.
7
*
8
* Redistribution and use in source and binary forms, with or without
9
* modification, are permitted provided that the following conditions
10
* are met:
11
* 1. Redistributions of source code must retain the above copyright
12
* notice, this list of conditions and the following disclaimer.
13
* 2. Redistributions in binary form must reproduce the above copyright
14
* notice, this list of conditions and the following disclaimer in the
15
* documentation and/or other materials provided with the distribution.
16
*
17
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27
* SUCH DAMAGE.
28
*/
29
30
/*
31
* Public functions are called linuxkpi_*().
32
* Internal (static) functions are called lkpi_*().
33
*
34
* The internal structures holding metadata over public structures are also
35
* called lkpi_xxx (usually with a member at the end called xxx).
36
* Note: we do not replicate the structure names but the general variable names
37
* for these (e.g., struct hw -> struct lkpi_hw, struct sta -> struct lkpi_sta).
38
* There are macros to access one from the other.
39
* We call the internal versions lxxx (e.g., hw -> lhw, sta -> lsta).
40
*/
41
42
#ifndef _LKPI_SRC_LINUX_80211_H
43
#define _LKPI_SRC_LINUX_80211_H
44
45
#include "opt_wlan.h"
46
47
#if defined(IEEE80211_DEBUG) && !defined(LINUXKPI_DEBUG_80211)
48
#define LINUXKPI_DEBUG_80211
49
#endif
50
51
/* #define LINUXKPI_DEBUG_80211 */
52
53
#ifndef D80211_TODO
54
#define D80211_TODO 0x00000001
55
#endif
56
#ifndef D80211_IMPROVE
57
#define D80211_IMPROVE 0x00000002
58
#endif
59
#define D80211_IMPROVE_TXQ 0x00000004
60
#define D80211_TRACE 0x00000010
61
#define D80211_TRACEOK 0x00000020
62
#define D80211_SCAN 0x00000040
63
#define D80211_SCAN_BEACON 0x00000080
64
#define D80211_TRACE_TX 0x00000100
65
#define D80211_TRACE_TX_DUMP 0x00000200
66
#define D80211_TRACE_RX 0x00001000
67
#define D80211_TRACE_RX_DUMP 0x00002000
68
#define D80211_TRACE_RX_BEACONS 0x00004000
69
#define D80211_TRACEX (D80211_TRACE_TX|D80211_TRACE_RX)
70
#define D80211_TRACEX_DUMP (D80211_TRACE_TX_DUMP|D80211_TRACE_RX_DUMP)
71
#define D80211_TRACE_STA 0x00010000
72
#define D80211_TRACE_HW_CRYPTO 0x00020000
73
#define D80211_TRACE_MO 0x00100000
74
#define D80211_TRACE_MODE 0x0f000000
75
#define D80211_TRACE_MODE_HT 0x01000000
76
#define D80211_TRACE_MODE_VHT 0x02000000
77
#define D80211_TRACE_MODE_HE 0x04000000
78
#define D80211_TRACE_MODE_EHT 0x08000000
79
80
#ifdef LINUXKPI_DEBUG_80211
81
#define TRACE_SCAN(ic, fmt, ...) \
82
if (linuxkpi_debug_80211 & D80211_SCAN) \
83
printf("%s:%d: %s SCAN " fmt "\n", \
84
__func__, __LINE__, ic->ic_name, ##__VA_ARGS__)
85
#define TRACE_SCAN_BEACON(ic, fmt, ...) \
86
if (linuxkpi_debug_80211 & D80211_SCAN_BEACON) \
87
printf("%s:%d: %s SCAN " fmt "\n", \
88
__func__, __LINE__, ic->ic_name, ##__VA_ARGS__)
89
#else
90
#define TRACE_SCAN(...) do {} while (0)
91
#define TRACE_SCAN_BEACON(...) do {} while (0)
92
#endif
93
94
#define IMPROVE_TXQ(...) \
95
if (linuxkpi_debug_80211 & D80211_IMPROVE_TXQ) \
96
printf("%s:%d: XXX LKPI80211 IMPROVE_TXQ\n", __func__, __LINE__)
97
98
#define IMPROVE_HT(fmt, ...) \
99
if (linuxkpi_debug_80211 & D80211_TRACE_MODE_HT) \
100
printf("%s:%d: XXX LKPI80211 IMPROVE_HT " fmt "\n", \
101
__func__, __LINE__, ##__VA_ARGS__);
102
103
#define MTAG_ABI_LKPI80211 1707696513 /* LinuxKPI 802.11 KBI */
104
105
#ifdef LKPI_80211_USE_MTAG
106
/*
107
* Deferred RX path.
108
* We need to pass *ni along (and possibly more in the future so
109
* we use a struct right from the start.
110
*/
111
#define LKPI80211_TAG_RXNI 0 /* deferred RX path */
112
struct lkpi_80211_tag_rxni {
113
struct ieee80211_node *ni; /* MUST hold a reference to it. */
114
};
115
#endif
116
117
struct lkpi_radiotap_tx_hdr {
118
struct ieee80211_radiotap_header wt_ihdr;
119
uint8_t wt_flags;
120
uint8_t wt_rate;
121
uint16_t wt_chan_freq;
122
uint16_t wt_chan_flags;
123
} __packed;
124
#define LKPI_RTAP_TX_FLAGS_PRESENT \
125
((1 << IEEE80211_RADIOTAP_FLAGS) | \
126
(1 << IEEE80211_RADIOTAP_RATE) | \
127
(1 << IEEE80211_RADIOTAP_CHANNEL))
128
129
struct lkpi_radiotap_rx_hdr {
130
struct ieee80211_radiotap_header wr_ihdr;
131
uint64_t wr_tsft;
132
uint8_t wr_flags;
133
uint8_t wr_rate;
134
uint16_t wr_chan_freq;
135
uint16_t wr_chan_flags;
136
int8_t wr_dbm_antsignal;
137
int8_t wr_dbm_antnoise;
138
} __packed __aligned(8);
139
#define LKPI_RTAP_RX_FLAGS_PRESENT \
140
((1 << IEEE80211_RADIOTAP_TSFT) | \
141
(1 << IEEE80211_RADIOTAP_FLAGS) | \
142
(1 << IEEE80211_RADIOTAP_RATE) | \
143
(1 << IEEE80211_RADIOTAP_CHANNEL) | \
144
(1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) | \
145
(1 << IEEE80211_RADIOTAP_DBM_ANTNOISE))
146
147
struct lkpi_hw;
148
149
struct lkpi_txq {
150
TAILQ_ENTRY(lkpi_txq) txq_entry;
151
152
struct mtx ltxq_mtx;
153
bool seen_dequeue;
154
bool stopped;
155
uint32_t txq_generation;
156
struct sk_buff_head skbq;
157
158
/* Must be last! */
159
struct ieee80211_txq txq __aligned(CACHE_LINE_SIZE);
160
};
161
#define TXQ_TO_LTXQ(_txq) container_of(_txq, struct lkpi_txq, txq)
162
163
164
struct lkpi_sta {
165
struct list_head lsta_list;
166
struct ieee80211_node *ni;
167
struct ieee80211_hw *hw; /* back pointer f. locking. */
168
169
/* Deferred TX path. */
170
/* Eventually we might want to migrate this into net80211 entirely. */
171
/* XXX-BZ can we use sta->txq[] instead directly? */
172
struct task txq_task;
173
struct mbufq txq;
174
struct mtx txq_mtx;
175
176
struct ieee80211_key_conf *kc[IEEE80211_WEP_NKID];
177
enum ieee80211_sta_state state;
178
bool txq_ready; /* Can we run the taskq? */
179
bool added_to_drv; /* Driver knows; i.e. we called ...(). */
180
bool in_mgd; /* XXX-BZ should this be per-vif? */
181
182
struct station_info sinfo; /* statistics */
183
184
/* Must be last! */
185
struct ieee80211_sta sta __aligned(CACHE_LINE_SIZE);
186
};
187
#define STA_TO_LSTA(_sta) container_of(_sta, struct lkpi_sta, sta)
188
#define LSTA_TO_STA(_lsta) (&(_lsta)->sta)
189
190
/* Either protected by wiphy lock or rcu for the list. */
191
struct lkpi_vif {
192
TAILQ_ENTRY(lkpi_vif) lvif_entry;
193
struct ieee80211vap iv_vap;
194
eventhandler_tag lvif_ifllevent;
195
196
struct sysctl_ctx_list sysctl_ctx;
197
198
struct mtx mtx;
199
struct wireless_dev wdev;
200
201
/* Other local stuff. */
202
int (*iv_newstate)(struct ieee80211vap *,
203
enum ieee80211_state, int);
204
struct ieee80211_node * (*iv_update_bss)(struct ieee80211vap *,
205
struct ieee80211_node *);
206
void (*iv_recv_mgmt)(struct ieee80211_node *,
207
struct mbuf *, int,
208
const struct ieee80211_rx_stats *,
209
int, int);
210
struct task sw_scan_task;
211
212
struct list_head lsta_list;
213
214
struct lkpi_sta *lvif_bss;
215
216
struct ieee80211_node *key_update_iv_bss;
217
int ic_unlocked; /* Count of ic unlocks pending (*mo_set_key) */
218
int nt_unlocked; /* Count of nt unlocks pending (*mo_set_key) */
219
int beacons; /* # of beacons since assoc */
220
bool lvif_bss_synched;
221
bool added_to_drv; /* Driver knows; i.e. we called add_interface(). */
222
223
bool hw_queue_stopped[IEEE80211_NUM_ACS];
224
225
/* Must be last! */
226
struct ieee80211_vif vif __aligned(CACHE_LINE_SIZE);
227
};
228
#define VAP_TO_LVIF(_vap) container_of(_vap, struct lkpi_vif, iv_vap)
229
#define LVIF_TO_VAP(_lvif) (&(_lvif)->iv_vap)
230
#define VIF_TO_LVIF(_vif) container_of(_vif, struct lkpi_vif, vif)
231
#define LVIF_TO_VIF(_lvif) (&(_lvif)->vif)
232
233
234
struct lkpi_hw { /* name it mac80211_sc? */
235
const struct ieee80211_ops *ops;
236
struct ieee80211_scan_request *hw_req;
237
struct workqueue_struct *workq;
238
239
/* FreeBSD specific compat. */
240
/* Linux device is in hw.wiphy->dev after SET_IEEE80211_DEV(). */
241
struct ieee80211com *ic;
242
struct lkpi_radiotap_tx_hdr rtap_tx;
243
struct lkpi_radiotap_rx_hdr rtap_rx;
244
245
TAILQ_HEAD(, lkpi_vif) lvif_head;
246
struct sx lvif_sx;
247
248
struct list_head lchanctx_list;
249
struct netdev_hw_addr_list mc_list;
250
unsigned int mc_flags;
251
struct sx mc_sx;
252
253
struct mtx txq_mtx;
254
uint32_t txq_generation[IEEE80211_NUM_ACS];
255
TAILQ_HEAD(, lkpi_txq) scheduled_txqs[IEEE80211_NUM_ACS];
256
spinlock_t txq_lock;
257
258
/* Deferred RX path. */
259
struct task rxq_task;
260
struct mbufq rxq;
261
struct mtx rxq_mtx;
262
263
/* Scan functions we overload to handle depending on scan mode. */
264
void (*ic_scan_curchan)(struct ieee80211_scan_state *,
265
unsigned long);
266
void (*ic_scan_mindwell)(struct ieee80211_scan_state *);
267
268
/* Node functions we overload to sync state. */
269
struct ieee80211_node * (*ic_node_alloc)(struct ieee80211vap *,
270
const uint8_t [IEEE80211_ADDR_LEN]);
271
int (*ic_node_init)(struct ieee80211_node *);
272
void (*ic_node_cleanup)(struct ieee80211_node *);
273
void (*ic_node_free)(struct ieee80211_node *);
274
275
/* HT and later functions. */
276
int (*ic_recv_action)(struct ieee80211_node *,
277
const struct ieee80211_frame *,
278
const uint8_t *, const uint8_t *);
279
int (*ic_send_action)(struct ieee80211_node *,
280
int, int, void *);
281
int (*ic_ampdu_enable)(struct ieee80211_node *,
282
struct ieee80211_tx_ampdu *);
283
int (*ic_addba_request)(struct ieee80211_node *,
284
struct ieee80211_tx_ampdu *, int, int, int);
285
int (*ic_addba_response)(struct ieee80211_node *,
286
struct ieee80211_tx_ampdu *, int, int, int);
287
void (*ic_addba_stop)(struct ieee80211_node *,
288
struct ieee80211_tx_ampdu *);
289
void (*ic_addba_response_timeout)(struct ieee80211_node *,
290
struct ieee80211_tx_ampdu *);
291
void (*ic_bar_response)(struct ieee80211_node *,
292
struct ieee80211_tx_ampdu *, int);
293
int (*ic_ampdu_rx_start)(struct ieee80211_node *,
294
struct ieee80211_rx_ampdu *, int, int, int);
295
void (*ic_ampdu_rx_stop)(struct ieee80211_node *,
296
struct ieee80211_rx_ampdu *);
297
298
#define LKPI_MAC80211_DRV_STARTED 0x00000001
299
uint32_t sc_flags;
300
#define LKPI_LHW_SCAN_RUNNING 0x00000001
301
#define LKPI_LHW_SCAN_HW 0x00000002
302
uint32_t scan_flags;
303
struct mtx scan_mtx;
304
305
int supbands; /* Number of supported bands. */
306
int max_rates; /* Maximum number of bitrates supported in any channel. */
307
int scan_ie_len; /* Length of common per-band scan IEs. */
308
309
bool mc_all_multi;
310
bool update_wme;
311
bool rxq_stopped;
312
313
/* Must be last! */
314
struct ieee80211_hw hw __aligned(CACHE_LINE_SIZE);
315
};
316
#define LHW_TO_HW(_lhw) (&(_lhw)->hw)
317
#define HW_TO_LHW(_hw) container_of(_hw, struct lkpi_hw, hw)
318
319
#define LKPI_LHW_SCAN_BITS \
320
"\010\1RUNING\2HW"
321
322
struct lkpi_chanctx {
323
struct list_head entry;
324
325
bool added_to_drv; /* Managed by MO */
326
327
struct ieee80211_chanctx_conf chanctx_conf __aligned(CACHE_LINE_SIZE);
328
};
329
#define LCHANCTX_TO_CHANCTX_CONF(_lchanctx) \
330
(&(_lchanctx)->chanctx_conf)
331
#define CHANCTX_CONF_TO_LCHANCTX(_conf) \
332
container_of(_conf, struct lkpi_chanctx, chanctx_conf)
333
334
struct lkpi_wiphy {
335
const struct cfg80211_ops *ops;
336
337
struct work_struct wwk;
338
struct list_head wwk_list;
339
struct mtx wwk_mtx;
340
341
/* Must be last! */
342
struct wiphy wiphy __aligned(CACHE_LINE_SIZE);
343
};
344
#define WIPHY_TO_LWIPHY(_wiphy) container_of(_wiphy, struct lkpi_wiphy, wiphy)
345
#define LWIPHY_TO_WIPHY(_lwiphy) (&(_lwiphy)->wiphy)
346
347
#define LKPI_80211_LWIPHY_WORK_LOCK_INIT(_lwiphy) \
348
mtx_init(&(_lwiphy)->wwk_mtx, "lwiphy-work", NULL, MTX_DEF);
349
#define LKPI_80211_LWIPHY_WORK_LOCK_DESTROY(_lwiphy) \
350
mtx_destroy(&(_lwiphy)->wwk_mtx)
351
#define LKPI_80211_LWIPHY_WORK_LOCK(_lwiphy) \
352
mtx_lock(&(_lwiphy)->wwk_mtx)
353
#define LKPI_80211_LWIPHY_WORK_UNLOCK(_lwiphy) \
354
mtx_unlock(&(_lwiphy)->wwk_mtx)
355
#define LKPI_80211_LWIPHY_WORK_LOCK_ASSERT(_lwiphy) \
356
mtx_assert(&(_lwiphy)->wwk_mtx, MA_OWNED)
357
#define LKPI_80211_LWIPHY_WORK_UNLOCK_ASSERT(_lwiphy) \
358
mtx_assert(&(_lwiphy)->wwk_mtx, MA_NOTOWNED)
359
360
#define LKPI_80211_LHW_SCAN_LOCK_INIT(_lhw) \
361
mtx_init(&(_lhw)->scan_mtx, "lhw-scan", NULL, MTX_DEF | MTX_RECURSE);
362
#define LKPI_80211_LHW_SCAN_LOCK_DESTROY(_lhw) \
363
mtx_destroy(&(_lhw)->scan_mtx);
364
#define LKPI_80211_LHW_SCAN_LOCK(_lhw) \
365
mtx_lock(&(_lhw)->scan_mtx)
366
#define LKPI_80211_LHW_SCAN_UNLOCK(_lhw) \
367
mtx_unlock(&(_lhw)->scan_mtx)
368
#define LKPI_80211_LHW_SCAN_LOCK_ASSERT(_lhw) \
369
mtx_assert(&(_lhw)->scan_mtx, MA_OWNED)
370
#define LKPI_80211_LHW_SCAN_UNLOCK_ASSERT(_lhw) \
371
mtx_assert(&(_lhw)->scan_mtx, MA_NOTOWNED)
372
373
#define LKPI_80211_LHW_TXQ_LOCK_INIT(_lhw) \
374
mtx_init(&(_lhw)->txq_mtx, "lhw-txq", NULL, MTX_DEF | MTX_RECURSE);
375
#define LKPI_80211_LHW_TXQ_LOCK_DESTROY(_lhw) \
376
mtx_destroy(&(_lhw)->txq_mtx);
377
#define LKPI_80211_LHW_TXQ_LOCK(_lhw) \
378
mtx_lock(&(_lhw)->txq_mtx)
379
#define LKPI_80211_LHW_TXQ_UNLOCK(_lhw) \
380
mtx_unlock(&(_lhw)->txq_mtx)
381
#define LKPI_80211_LHW_TXQ_LOCK_ASSERT(_lhw) \
382
mtx_assert(&(_lhw)->txq_mtx, MA_OWNED)
383
#define LKPI_80211_LHW_TXQ_UNLOCK_ASSERT(_lhw) \
384
mtx_assert(&(_lhw)->txq_mtx, MA_NOTOWNED)
385
386
#define LKPI_80211_LHW_RXQ_LOCK_INIT(_lhw) \
387
mtx_init(&(_lhw)->rxq_mtx, "lhw-rxq", NULL, MTX_DEF | MTX_RECURSE);
388
#define LKPI_80211_LHW_RXQ_LOCK_DESTROY(_lhw) \
389
mtx_destroy(&(_lhw)->rxq_mtx);
390
#define LKPI_80211_LHW_RXQ_LOCK(_lhw) \
391
mtx_lock(&(_lhw)->rxq_mtx)
392
#define LKPI_80211_LHW_RXQ_UNLOCK(_lhw) \
393
mtx_unlock(&(_lhw)->rxq_mtx)
394
#define LKPI_80211_LHW_RXQ_LOCK_ASSERT(_lhw) \
395
mtx_assert(&(_lhw)->rxq_mtx, MA_OWNED)
396
#define LKPI_80211_LHW_RXQ_UNLOCK_ASSERT(_lhw) \
397
mtx_assert(&(_lhw)->rxq_mtx, MA_NOTOWNED)
398
399
#define LKPI_80211_LHW_LVIF_LOCK(_lhw) sx_xlock(&(_lhw)->lvif_sx)
400
#define LKPI_80211_LHW_LVIF_UNLOCK(_lhw) sx_xunlock(&(_lhw)->lvif_sx)
401
402
#define LKPI_80211_LHW_MC_LOCK_INIT(_lhw) \
403
sx_init_flags(&lhw->mc_sx, "lhw-mc", 0);
404
#define LKPI_80211_LHW_MC_LOCK_DESTROY(_lhw) \
405
sx_destroy(&lhw->mc_sx);
406
#define LKPI_80211_LHW_MC_LOCK(_lhw) sx_xlock(&(_lhw)->mc_sx)
407
#define LKPI_80211_LHW_MC_UNLOCK(_lhw) sx_xunlock(&(_lhw)->mc_sx)
408
409
#define LKPI_80211_LVIF_LOCK(_lvif) mtx_lock(&(_lvif)->mtx)
410
#define LKPI_80211_LVIF_UNLOCK(_lvif) mtx_unlock(&(_lvif)->mtx)
411
412
#define LKPI_80211_LSTA_TXQ_LOCK_INIT(_lsta) \
413
mtx_init(&(_lsta)->txq_mtx, "lsta-txq", NULL, MTX_DEF);
414
#define LKPI_80211_LSTA_TXQ_LOCK_DESTROY(_lsta) \
415
mtx_destroy(&(_lsta)->txq_mtx);
416
#define LKPI_80211_LSTA_TXQ_LOCK(_lsta) \
417
mtx_lock(&(_lsta)->txq_mtx)
418
#define LKPI_80211_LSTA_TXQ_UNLOCK(_lsta) \
419
mtx_unlock(&(_lsta)->txq_mtx)
420
#define LKPI_80211_LSTA_TXQ_LOCK_ASSERT(_lsta) \
421
mtx_assert(&(_lsta)->txq_mtx, MA_OWNED)
422
#define LKPI_80211_LSTA_TXQ_UNLOCK_ASSERT(_lsta) \
423
mtx_assert(&(_lsta)->txq_mtx, MA_NOTOWNED)
424
425
#define LKPI_80211_LTXQ_LOCK_INIT(_ltxq) \
426
mtx_init(&(_ltxq)->ltxq_mtx, "ltxq", NULL, MTX_DEF);
427
#define LKPI_80211_LTXQ_LOCK_DESTROY(_ltxq) \
428
mtx_destroy(&(_ltxq)->ltxq_mtx);
429
#define LKPI_80211_LTXQ_LOCK(_ltxq) \
430
mtx_lock(&(_ltxq)->ltxq_mtx)
431
#define LKPI_80211_LTXQ_UNLOCK(_ltxq) \
432
mtx_unlock(&(_ltxq)->ltxq_mtx)
433
#define LKPI_80211_LTXQ_LOCK_ASSERT(_ltxq) \
434
mtx_assert(&(_ltxq)->ltxq_mtx, MA_OWNED)
435
#define LKPI_80211_LTXQ_UNLOCK_ASSERT(_ltxq) \
436
mtx_assert(&(_ltxq)->ltxq_mtx, MA_NOTOWNED)
437
438
int lkpi_80211_mo_start(struct ieee80211_hw *);
439
void lkpi_80211_mo_stop(struct ieee80211_hw *, bool);
440
int lkpi_80211_mo_get_antenna(struct ieee80211_hw *, u32 *, u32 *);
441
int lkpi_80211_mo_set_frag_threshold(struct ieee80211_hw *, uint32_t);
442
int lkpi_80211_mo_set_rts_threshold(struct ieee80211_hw *, uint32_t);
443
int lkpi_80211_mo_add_interface(struct ieee80211_hw *, struct ieee80211_vif *);
444
void lkpi_80211_mo_remove_interface(struct ieee80211_hw *, struct ieee80211_vif *);
445
int lkpi_80211_mo_hw_scan(struct ieee80211_hw *, struct ieee80211_vif *,
446
struct ieee80211_scan_request *);
447
void lkpi_80211_mo_cancel_hw_scan(struct ieee80211_hw *, struct ieee80211_vif *);
448
void lkpi_80211_mo_sw_scan_complete(struct ieee80211_hw *, struct ieee80211_vif *);
449
void lkpi_80211_mo_sw_scan_start(struct ieee80211_hw *, struct ieee80211_vif *,
450
const u8 *);
451
u64 lkpi_80211_mo_prepare_multicast(struct ieee80211_hw *,
452
struct netdev_hw_addr_list *);
453
void lkpi_80211_mo_configure_filter(struct ieee80211_hw *, unsigned int,
454
unsigned int *, u64);
455
int lkpi_80211_mo_sta_state(struct ieee80211_hw *, struct ieee80211_vif *,
456
struct lkpi_sta *, enum ieee80211_sta_state);
457
int lkpi_80211_mo_config(struct ieee80211_hw *, uint32_t);
458
int lkpi_80211_mo_assign_vif_chanctx(struct ieee80211_hw *, struct ieee80211_vif *,
459
struct ieee80211_bss_conf *, struct ieee80211_chanctx_conf *);
460
void lkpi_80211_mo_unassign_vif_chanctx(struct ieee80211_hw *, struct ieee80211_vif *,
461
struct ieee80211_bss_conf *, struct ieee80211_chanctx_conf *);
462
int lkpi_80211_mo_add_chanctx(struct ieee80211_hw *, struct ieee80211_chanctx_conf *);
463
void lkpi_80211_mo_change_chanctx(struct ieee80211_hw *,
464
struct ieee80211_chanctx_conf *, uint32_t);
465
void lkpi_80211_mo_remove_chanctx(struct ieee80211_hw *,
466
struct ieee80211_chanctx_conf *);
467
void lkpi_80211_mo_bss_info_changed(struct ieee80211_hw *, struct ieee80211_vif *,
468
struct ieee80211_bss_conf *, uint64_t);
469
int lkpi_80211_mo_conf_tx(struct ieee80211_hw *, struct ieee80211_vif *,
470
uint32_t, uint16_t, const struct ieee80211_tx_queue_params *);
471
void lkpi_80211_mo_flush(struct ieee80211_hw *, struct ieee80211_vif *,
472
uint32_t, bool);
473
void lkpi_80211_mo_mgd_prepare_tx(struct ieee80211_hw *, struct ieee80211_vif *,
474
struct ieee80211_prep_tx_info *);
475
void lkpi_80211_mo_mgd_complete_tx(struct ieee80211_hw *, struct ieee80211_vif *,
476
struct ieee80211_prep_tx_info *);
477
void lkpi_80211_mo_tx(struct ieee80211_hw *, struct ieee80211_tx_control *,
478
struct sk_buff *);
479
void lkpi_80211_mo_wake_tx_queue(struct ieee80211_hw *, struct ieee80211_txq *);
480
void lkpi_80211_mo_sync_rx_queues(struct ieee80211_hw *);
481
void lkpi_80211_mo_sta_pre_rcu_remove(struct ieee80211_hw *,
482
struct ieee80211_vif *, struct ieee80211_sta *);
483
int lkpi_80211_mo_set_key(struct ieee80211_hw *, enum set_key_cmd,
484
struct ieee80211_vif *, struct ieee80211_sta *,
485
struct ieee80211_key_conf *);
486
int lkpi_80211_mo_ampdu_action(struct ieee80211_hw *, struct ieee80211_vif *,
487
struct ieee80211_ampdu_params *);
488
int lkpi_80211_mo_sta_statistics(struct ieee80211_hw *, struct ieee80211_vif *,
489
struct ieee80211_sta *, struct station_info *);
490
491
#endif /* _LKPI_SRC_LINUX_80211_H */
492
493