Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/compat/linuxkpi/common/include/net/mac80211.h
104102 views
1
/*-
2
* Copyright (c) 2020-2026 The FreeBSD Foundation
3
* Copyright (c) 2020-2025 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
#ifndef _LINUXKPI_NET_MAC80211_H
31
#define _LINUXKPI_NET_MAC80211_H
32
33
#include <sys/types.h>
34
35
#include <asm/atomic64.h>
36
#include <linux/bitops.h>
37
#include <linux/bitfield.h>
38
#include <linux/etherdevice.h>
39
#include <linux/ethtool.h>
40
#include <linux/netdevice.h>
41
#include <linux/skbuff.h>
42
#include <linux/workqueue.h>
43
#include <linux/dcache.h>
44
#include <linux/ieee80211.h>
45
#include <net/cfg80211.h>
46
#include <net/if_inet6.h>
47
48
#define ARPHRD_IEEE80211_RADIOTAP __LINE__ /* XXX TODO brcmfmac */
49
50
#define WLAN_OUI_MICROSOFT (0x0050F2)
51
#define WLAN_OUI_TYPE_MICROSOFT_WPA (1)
52
#define WLAN_OUI_TYPE_MICROSOFT_TPC (8)
53
#define WLAN_OUI_TYPE_WFA_P2P (9)
54
#define WLAN_OUI_WFA (0x506F9A)
55
56
#define IEEE80211_LINK_UNSPECIFIED 0x0f
57
58
/* hw->conf.flags */
59
enum ieee80211_hw_conf_flags {
60
IEEE80211_CONF_IDLE = BIT(0),
61
IEEE80211_CONF_PS = BIT(1),
62
IEEE80211_CONF_MONITOR = BIT(2),
63
IEEE80211_CONF_OFFCHANNEL = BIT(3),
64
};
65
66
/* (*ops->config()) */
67
enum ieee80211_hw_conf_changed_flags {
68
IEEE80211_CONF_CHANGE_CHANNEL = BIT(0),
69
IEEE80211_CONF_CHANGE_IDLE = BIT(1),
70
IEEE80211_CONF_CHANGE_PS = BIT(2),
71
IEEE80211_CONF_CHANGE_MONITOR = BIT(3),
72
IEEE80211_CONF_CHANGE_POWER = BIT(4),
73
};
74
75
#define CFG80211_TESTMODE_CMD(_x) /* XXX TODO */
76
#define CFG80211_TESTMODE_DUMP(_x) /* XXX TODO */
77
78
#define FCS_LEN 4
79
80
/* ops.configure_filter() */
81
enum mcast_filter_flags {
82
FIF_ALLMULTI = BIT(0),
83
FIF_PROBE_REQ = BIT(1),
84
FIF_BCN_PRBRESP_PROMISC = BIT(2),
85
FIF_FCSFAIL = BIT(3),
86
FIF_OTHER_BSS = BIT(4),
87
FIF_PSPOLL = BIT(5),
88
FIF_CONTROL = BIT(6),
89
FIF_MCAST_ACTION = BIT(7),
90
91
/* Must stay last. */
92
FIF_FLAGS_MASK = BIT(8)-1,
93
};
94
95
enum ieee80211_bss_changed {
96
BSS_CHANGED_ARP_FILTER = BIT(0),
97
BSS_CHANGED_ASSOC = BIT(1),
98
BSS_CHANGED_BANDWIDTH = BIT(2),
99
BSS_CHANGED_BEACON = BIT(3),
100
BSS_CHANGED_BEACON_ENABLED = BIT(4),
101
BSS_CHANGED_BEACON_INFO = BIT(5),
102
BSS_CHANGED_BEACON_INT = BIT(6),
103
BSS_CHANGED_BSSID = BIT(7),
104
BSS_CHANGED_CQM = BIT(8),
105
BSS_CHANGED_ERP_CTS_PROT = BIT(9),
106
BSS_CHANGED_ERP_SLOT = BIT(10),
107
BSS_CHANGED_FTM_RESPONDER = BIT(11),
108
BSS_CHANGED_HT = BIT(12),
109
BSS_CHANGED_IDLE = BIT(13),
110
BSS_CHANGED_MU_GROUPS = BIT(14),
111
BSS_CHANGED_P2P_PS = BIT(15),
112
BSS_CHANGED_PS = BIT(16),
113
BSS_CHANGED_QOS = BIT(17),
114
BSS_CHANGED_TXPOWER = BIT(18),
115
BSS_CHANGED_HE_BSS_COLOR = BIT(19),
116
BSS_CHANGED_AP_PROBE_RESP = BIT(20),
117
BSS_CHANGED_BASIC_RATES = BIT(21),
118
BSS_CHANGED_ERP_PREAMBLE = BIT(22),
119
BSS_CHANGED_IBSS = BIT(23),
120
BSS_CHANGED_MCAST_RATE = BIT(24),
121
BSS_CHANGED_SSID = BIT(25),
122
BSS_CHANGED_FILS_DISCOVERY = BIT(26),
123
BSS_CHANGED_HE_OBSS_PD = BIT(27),
124
BSS_CHANGED_TWT = BIT(28),
125
BSS_CHANGED_UNSOL_BCAST_PROBE_RESP = BIT(30),
126
BSS_CHANGED_EHT_PUNCTURING = BIT(31),
127
BSS_CHANGED_MLD_VALID_LINKS = BIT_ULL(32),
128
BSS_CHANGED_MLD_TTLM = BIT_ULL(33),
129
BSS_CHANGED_TPE = BIT_ULL(34),
130
};
131
132
/* 802.11 Figure 9-256 Suite selector format. [OUI(3), SUITE TYPE(1)] */
133
#define WLAN_CIPHER_SUITE_OUI(_oui, _x) (((_oui) << 8) | ((_x) & 0xff))
134
135
/* 802.11 Table 9-131 Cipher suite selectors. */
136
/* 802.1x suite B 11 */
137
#define WLAN_CIPHER_SUITE(_x) WLAN_CIPHER_SUITE_OUI(0x000fac, _x)
138
/* Use group 0 */
139
#define WLAN_CIPHER_SUITE_WEP40 WLAN_CIPHER_SUITE(1)
140
#define WLAN_CIPHER_SUITE_TKIP WLAN_CIPHER_SUITE(2)
141
/* Reserved 3 */
142
#define WLAN_CIPHER_SUITE_CCMP WLAN_CIPHER_SUITE(4) /* CCMP-128 */
143
#define WLAN_CIPHER_SUITE_WEP104 WLAN_CIPHER_SUITE(5)
144
#define WLAN_CIPHER_SUITE_AES_CMAC WLAN_CIPHER_SUITE(6) /* BIP-CMAC-128 */
145
/* Group addressed traffic not allowed 7 */
146
#define WLAN_CIPHER_SUITE_GCMP WLAN_CIPHER_SUITE(8)
147
#define WLAN_CIPHER_SUITE_GCMP_256 WLAN_CIPHER_SUITE(9)
148
#define WLAN_CIPHER_SUITE_CCMP_256 WLAN_CIPHER_SUITE(10)
149
#define WLAN_CIPHER_SUITE_BIP_GMAC_128 WLAN_CIPHER_SUITE(11)
150
#define WLAN_CIPHER_SUITE_BIP_GMAC_256 WLAN_CIPHER_SUITE(12)
151
#define WLAN_CIPHER_SUITE_BIP_CMAC_256 WLAN_CIPHER_SUITE(13)
152
/* Reserved 14-255 */
153
154
/* See ISO/IEC JTC 1 N 9880 Table 11 */
155
#define WLAN_CIPHER_SUITE_SMS4 WLAN_CIPHER_SUITE_OUI(0x001472, 1)
156
157
158
/* 802.11 Table 9-133 AKM suite selectors. */
159
#define WLAN_AKM_SUITE(_x) WLAN_CIPHER_SUITE_OUI(0x000fac, _x)
160
/* Reserved 0 */
161
#define WLAN_AKM_SUITE_8021X WLAN_AKM_SUITE(1)
162
#define WLAN_AKM_SUITE_PSK WLAN_AKM_SUITE(2)
163
#define WLAN_AKM_SUITE_FT_8021X WLAN_AKM_SUITE(3)
164
#define WLAN_AKM_SUITE_FT_PSK WLAN_AKM_SUITE(4)
165
#define WLAN_AKM_SUITE_8021X_SHA256 WLAN_AKM_SUITE(5)
166
#define WLAN_AKM_SUITE_PSK_SHA256 WLAN_AKM_SUITE(6)
167
/* TDLS 7 */
168
#define WLAN_AKM_SUITE_SAE WLAN_AKM_SUITE(8)
169
#define WLAN_AKM_SUITE_FT_OVER_SAE WLAN_AKM_SUITE(9)
170
/* AP peer key 10 */
171
/* 802.1x suite B 11 */
172
/* 802.1x suite B 384 12 */
173
/* FTo802.1x 384 13 */
174
/* Reserved 14-255 */
175
/* Apparently 11ax defines more. Seen (19,20) mentioned. */
176
177
#define TKIP_PN_TO_IV16(_x) ((uint16_t)(_x & 0xffff))
178
#define TKIP_PN_TO_IV32(_x) ((uint32_t)((_x >> 16) & 0xffffffff))
179
180
enum ieee80211_neg_ttlm_res {
181
NEG_TTLM_RES_ACCEPT,
182
NEG_TTLM_RES_REJECT,
183
};
184
185
#define IEEE80211_TTLM_NUM_TIDS 8
186
struct ieee80211_neg_ttlm {
187
uint16_t downlink[IEEE80211_TTLM_NUM_TIDS];
188
uint16_t uplink[IEEE80211_TTLM_NUM_TIDS];
189
};
190
191
/* 802.11-2020 9.4.2.55.3 A-MPDU Parameters field */
192
#define IEEE80211_HT_AMPDU_PARM_FACTOR 0x3
193
#define IEEE80211_HT_AMPDU_PARM_DENSITY_SHIFT 2
194
#define IEEE80211_HT_AMPDU_PARM_DENSITY (0x7 << IEEE80211_HT_AMPDU_PARM_DENSITY_SHIFT)
195
196
struct ieee80211_sta;
197
198
struct ieee80211_ampdu_params {
199
struct ieee80211_sta *sta;
200
enum ieee80211_ampdu_mlme_action action;
201
uint16_t buf_size;
202
uint16_t timeout;
203
uint16_t ssn;
204
uint8_t tid;
205
bool amsdu;
206
};
207
208
struct ieee80211_bar {
209
/* TODO FIXME */
210
int control, start_seq_num;
211
uint8_t *ra;
212
uint16_t frame_control;
213
};
214
215
struct ieee80211_mutable_offsets {
216
/* TODO FIXME */
217
uint16_t tim_offset;
218
uint16_t cntdwn_counter_offs[2];
219
220
int mbssid_off;
221
};
222
223
struct mac80211_fils_discovery {
224
uint32_t max_interval;
225
};
226
227
struct ieee80211_chanctx_conf {
228
struct cfg80211_chan_def def;
229
struct cfg80211_chan_def min_def;
230
struct cfg80211_chan_def ap;
231
232
uint8_t rx_chains_dynamic;
233
uint8_t rx_chains_static;
234
bool radar_enabled;
235
236
/* Must stay last. */
237
uint8_t drv_priv[0] __aligned(CACHE_LINE_SIZE);
238
};
239
240
struct ieee80211_rate_status {
241
struct rate_info rate_idx;
242
uint8_t try_count;
243
};
244
245
struct ieee80211_ema_beacons {
246
uint8_t cnt;
247
struct {
248
struct sk_buff *skb;
249
struct ieee80211_mutable_offsets offs;
250
} bcn[0];
251
};
252
253
struct ieee80211_chanreq {
254
struct cfg80211_chan_def oper;
255
};
256
257
#define WLAN_MEMBERSHIP_LEN (8)
258
#define WLAN_USER_POSITION_LEN (16)
259
260
/*
261
* 802.11ac-2013, 8.4.2.164 VHT Transmit Power Envelope element
262
* 802.11-???? ?
263
*/
264
struct ieee80211_parsed_tpe_eirp {
265
int8_t power[5];
266
uint8_t count;
267
bool valid;
268
};
269
struct ieee80211_parsed_tpe_psd {
270
int8_t power[16];
271
uint8_t count;
272
bool valid;
273
};
274
struct ieee80211_parsed_tpe {
275
/* We see access to [0] so assume at least 2. */
276
struct ieee80211_parsed_tpe_eirp max_local[2];
277
struct ieee80211_parsed_tpe_eirp max_reg_client[2];
278
struct ieee80211_parsed_tpe_psd psd_local[2];
279
struct ieee80211_parsed_tpe_psd psd_reg_client[2];
280
};
281
282
struct ieee80211_bss_conf {
283
/* TODO FIXME */
284
struct ieee80211_vif *vif;
285
struct cfg80211_bss *bss;
286
const uint8_t *bssid;
287
uint8_t addr[ETH_ALEN];
288
uint8_t link_id;
289
uint8_t _pad0;
290
uint8_t transmitter_bssid[ETH_ALEN];
291
struct ieee80211_ftm_responder_params *ftmr_params;
292
struct ieee80211_p2p_noa_attr p2p_noa_attr;
293
struct ieee80211_chanreq chanreq;
294
__be32 arp_addr_list[1]; /* XXX TODO */
295
struct ieee80211_rate *beacon_rate;
296
struct {
297
uint8_t membership[WLAN_MEMBERSHIP_LEN];
298
uint8_t position[WLAN_USER_POSITION_LEN];
299
} mu_group;
300
struct {
301
uint32_t params;
302
/* single field struct? */
303
} he_oper;
304
struct cfg80211_he_bss_color he_bss_color;
305
struct ieee80211_he_obss_pd he_obss_pd;
306
307
bool ht_ldpc;
308
bool vht_ldpc;
309
bool he_ldpc;
310
bool vht_mu_beamformee;
311
bool vht_mu_beamformer;
312
bool vht_su_beamformee;
313
bool vht_su_beamformer;
314
bool he_mu_beamformer;
315
bool he_su_beamformee;
316
bool he_su_beamformer;
317
bool he_full_ul_mumimo;
318
bool eht_su_beamformee;
319
bool eht_su_beamformer;
320
bool eht_mu_beamformer;
321
322
uint16_t ht_operation_mode;
323
int arp_addr_cnt;
324
uint16_t eht_puncturing;
325
326
uint8_t dtim_period;
327
uint8_t sync_dtim_count;
328
uint8_t bss_param_ch_cnt_link_id;
329
bool qos;
330
bool twt_broadcast;
331
bool use_cts_prot;
332
bool use_short_preamble;
333
bool use_short_slot;
334
bool he_support;
335
bool eht_support;
336
bool csa_active;
337
bool mu_mimo_owner;
338
bool color_change_active;
339
uint32_t sync_device_ts;
340
uint64_t sync_tsf;
341
uint16_t beacon_int;
342
int16_t txpower;
343
uint32_t basic_rates;
344
int mcast_rate[NUM_NL80211_BANDS];
345
enum ieee80211_ap_reg_power power_type;
346
struct cfg80211_bitrate_mask beacon_tx_rate;
347
struct mac80211_fils_discovery fils_discovery;
348
struct ieee80211_chanctx_conf *chanctx_conf;
349
struct ieee80211_vif *mbssid_tx_vif;
350
struct ieee80211_parsed_tpe tpe;
351
352
int ack_enabled, bssid_index, bssid_indicator, cqm_rssi_hyst, cqm_rssi_thold, ema_ap, frame_time_rts_th, ftm_responder;
353
int htc_trig_based_pkt_ext;
354
int multi_sta_back_32bit, nontransmitted;
355
int profile_periodicity;
356
int twt_requester, uora_exists, uora_ocw_range;
357
int assoc_capability, enable_beacon, hidden_ssid, ibss_joined, twt_protected;
358
int twt_responder, unsol_bcast_probe_resp_interval;
359
};
360
361
struct ieee80211_channel_switch {
362
/* TODO FIXME */
363
int block_tx, count, delay, device_timestamp, timestamp;
364
uint8_t link_id;
365
struct cfg80211_chan_def chandef;
366
};
367
368
enum ieee80211_event_type {
369
BA_FRAME_TIMEOUT,
370
BAR_RX_EVENT,
371
MLME_EVENT,
372
RSSI_EVENT,
373
};
374
375
enum ieee80211_rssi_event_data {
376
RSSI_EVENT_LOW,
377
RSSI_EVENT_HIGH,
378
};
379
380
enum ieee80211_mlme_event_data {
381
ASSOC_EVENT,
382
AUTH_EVENT,
383
DEAUTH_RX_EVENT,
384
DEAUTH_TX_EVENT,
385
};
386
387
enum ieee80211_mlme_event_status {
388
MLME_DENIED,
389
MLME_TIMEOUT,
390
};
391
392
struct ieee80211_mlme_event {
393
enum ieee80211_mlme_event_data data;
394
enum ieee80211_mlme_event_status status;
395
int reason;
396
};
397
398
struct ieee80211_event {
399
/* TODO FIXME */
400
enum ieee80211_event_type type;
401
union {
402
struct {
403
int ssn;
404
struct ieee80211_sta *sta;
405
uint8_t tid;
406
} ba;
407
struct ieee80211_mlme_event mlme;
408
} u;
409
};
410
411
struct ieee80211_ftm_responder_params {
412
/* TODO FIXME */
413
uint8_t *lci;
414
uint8_t *civicloc;
415
int lci_len;
416
int civicloc_len;
417
};
418
419
struct ieee80211_conf {
420
int dynamic_ps_timeout;
421
int power_level;
422
uint32_t listen_interval;
423
bool radar_enabled;
424
enum ieee80211_hw_conf_flags flags;
425
struct cfg80211_chan_def chandef;
426
};
427
428
enum ieee80211_hw_flags {
429
IEEE80211_HW_AMPDU_AGGREGATION,
430
IEEE80211_HW_AP_LINK_PS,
431
IEEE80211_HW_BUFF_MMPDU_TXQ,
432
IEEE80211_HW_CHANCTX_STA_CSA,
433
IEEE80211_HW_CONNECTION_MONITOR,
434
IEEE80211_HW_DEAUTH_NEED_MGD_TX_PREP,
435
IEEE80211_HW_HAS_RATE_CONTROL,
436
IEEE80211_HW_MFP_CAPABLE,
437
IEEE80211_HW_NEEDS_UNIQUE_STA_ADDR,
438
IEEE80211_HW_REPORTS_TX_ACK_STATUS,
439
IEEE80211_HW_RX_INCLUDES_FCS,
440
IEEE80211_HW_SIGNAL_DBM,
441
IEEE80211_HW_SINGLE_SCAN_ON_ALL_BANDS,
442
IEEE80211_HW_SPECTRUM_MGMT,
443
IEEE80211_HW_STA_MMPDU_TXQ,
444
IEEE80211_HW_SUPPORTS_AMSDU_IN_AMPDU,
445
IEEE80211_HW_SUPPORTS_CLONED_SKBS,
446
IEEE80211_HW_SUPPORTS_DYNAMIC_PS,
447
IEEE80211_HW_SUPPORTS_MULTI_BSSID,
448
IEEE80211_HW_SUPPORTS_ONLY_HE_MULTI_BSSID,
449
IEEE80211_HW_SUPPORTS_PS,
450
IEEE80211_HW_SUPPORTS_REORDERING_BUFFER,
451
IEEE80211_HW_SUPPORTS_VHT_EXT_NSS_BW,
452
IEEE80211_HW_SUPPORT_FAST_XMIT,
453
IEEE80211_HW_TDLS_WIDER_BW,
454
IEEE80211_HW_TIMING_BEACON_ONLY,
455
IEEE80211_HW_TX_AMPDU_SETUP_IN_HW,
456
IEEE80211_HW_TX_AMSDU,
457
IEEE80211_HW_TX_FRAG_LIST,
458
IEEE80211_HW_USES_RSS,
459
IEEE80211_HW_WANT_MONITOR_VIF,
460
IEEE80211_HW_SW_CRYPTO_CONTROL,
461
IEEE80211_HW_SUPPORTS_TX_FRAG,
462
IEEE80211_HW_SUPPORTS_TDLS_BUFFER_STA,
463
IEEE80211_HW_SUPPORTS_PER_STA_GTK,
464
IEEE80211_HW_REPORTS_LOW_ACK,
465
IEEE80211_HW_QUEUE_CONTROL,
466
IEEE80211_HW_SUPPORTS_RX_DECAP_OFFLOAD,
467
IEEE80211_HW_SUPPORTS_TX_ENCAP_OFFLOAD,
468
IEEE80211_HW_SUPPORTS_RC_TABLE,
469
IEEE80211_HW_DETECTS_COLOR_COLLISION,
470
IEEE80211_HW_DISALLOW_PUNCTURING,
471
IEEE80211_HW_DISALLOW_PUNCTURING_5GHZ,
472
IEEE80211_HW_TX_STATUS_NO_AMPDU_LEN,
473
IEEE80211_HW_HANDLES_QUIET_CSA,
474
IEEE80211_HW_NO_VIRTUAL_MONITOR,
475
476
/* Keep last. */
477
NUM_IEEE80211_HW_FLAGS
478
};
479
480
struct ieee80211_hw {
481
482
struct wiphy *wiphy;
483
484
/* TODO FIXME */
485
int extra_tx_headroom, weight_multiplier;
486
int max_rate_tries, max_rates, max_report_rates;
487
const char *rate_control_algorithm;
488
struct {
489
uint16_t units_pos; /* radiotap "spec" is .. inconsistent. */
490
uint16_t accuracy;
491
} radiotap_timestamp;
492
size_t sta_data_size;
493
size_t vif_data_size;
494
size_t chanctx_data_size;
495
size_t txq_data_size;
496
uint16_t radiotap_mcs_details;
497
uint16_t radiotap_vht_details;
498
uint16_t queues;
499
uint16_t offchannel_tx_hw_queue;
500
uint16_t uapsd_max_sp_len;
501
uint16_t uapsd_queues;
502
uint16_t max_rx_aggregation_subframes;
503
uint16_t max_tx_aggregation_subframes;
504
uint16_t max_tx_fragments;
505
uint16_t max_listen_interval;
506
uint32_t extra_beacon_tailroom;
507
netdev_features_t netdev_features;
508
unsigned long flags[BITS_TO_LONGS(NUM_IEEE80211_HW_FLAGS)];
509
struct ieee80211_conf conf;
510
511
#if 0 /* leave here for documentation purposes. This does NOT work. */
512
/* Must stay last. */
513
uint8_t priv[0] __aligned(CACHE_LINE_SIZE);
514
#else
515
void *priv;
516
#endif
517
};
518
519
enum ieee802111_key_flag {
520
IEEE80211_KEY_FLAG_GENERATE_IV = BIT(0),
521
IEEE80211_KEY_FLAG_GENERATE_MMIC = BIT(1),
522
IEEE80211_KEY_FLAG_PAIRWISE = BIT(2),
523
IEEE80211_KEY_FLAG_PUT_IV_SPACE = BIT(3),
524
IEEE80211_KEY_FLAG_PUT_MIC_SPACE = BIT(4),
525
IEEE80211_KEY_FLAG_SW_MGMT_TX = BIT(5),
526
IEEE80211_KEY_FLAG_GENERATE_IV_MGMT = BIT(6),
527
IEEE80211_KEY_FLAG_GENERATE_MMIE = BIT(7),
528
IEEE80211_KEY_FLAG_RESERVE_TAILROOM = BIT(8),
529
IEEE80211_KEY_FLAG_SPP_AMSDU = BIT(9),
530
};
531
532
#define IEEE80211_KEY_FLAG_BITS \
533
"\20\1GENERATE_IV\2GENERATE_MMIC\3PAIRWISE\4PUT_IV_SPACE" \
534
"\5PUT_MIC_SPACE\6SW_MGMT_TX\7GENERATE_IV_MGMT\10GENERATE_MMIE" \
535
"\11RESERVE_TAILROOM\12SPP_AMSDU"
536
537
struct ieee80211_key_conf {
538
#if defined(__FreeBSD__)
539
const struct ieee80211_key *_k; /* backpointer to net80211 */
540
#endif
541
atomic64_t tx_pn;
542
uint32_t cipher;
543
uint8_t icv_len; /* __unused nowadays? */
544
uint8_t iv_len;
545
uint8_t hw_key_idx; /* Set by drv. */
546
uint8_t keyidx;
547
uint16_t flags;
548
int8_t link_id; /* signed! */
549
uint8_t keylen;
550
uint8_t key[0]; /* Must stay last! */
551
};
552
553
struct ieee80211_key_seq {
554
/* TODO FIXME */
555
union {
556
struct {
557
uint8_t seq[IEEE80211_MAX_PN_LEN];
558
uint8_t seq_len;
559
} hw;
560
struct {
561
uint8_t pn[IEEE80211_CCMP_PN_LEN];
562
} ccmp;
563
struct {
564
uint8_t pn[IEEE80211_GCMP_PN_LEN];
565
} gcmp;
566
struct {
567
uint8_t pn[IEEE80211_CMAC_PN_LEN];
568
} aes_cmac;
569
struct {
570
uint8_t pn[IEEE80211_GMAC_PN_LEN];
571
} aes_gmac;
572
struct {
573
uint32_t iv32;
574
uint16_t iv16;
575
} tkip;
576
};
577
};
578
579
580
enum ieee80211_rx_status_flags {
581
RX_FLAG_ALLOW_SAME_PN = BIT(0),
582
RX_FLAG_AMPDU_DETAILS = BIT(1),
583
RX_FLAG_AMPDU_EOF_BIT = BIT(2),
584
RX_FLAG_AMPDU_EOF_BIT_KNOWN = BIT(3),
585
RX_FLAG_DECRYPTED = BIT(4),
586
RX_FLAG_DUP_VALIDATED = BIT(5),
587
RX_FLAG_FAILED_FCS_CRC = BIT(6),
588
RX_FLAG_ICV_STRIPPED = BIT(7),
589
RX_FLAG_MACTIME = BIT(8) | BIT(9),
590
RX_FLAG_MACTIME_PLCP_START = 1 << 8,
591
RX_FLAG_MACTIME_START = 2 << 8,
592
RX_FLAG_MACTIME_END = 3 << 8,
593
RX_FLAG_MIC_STRIPPED = BIT(10),
594
RX_FLAG_MMIC_ERROR = BIT(11),
595
RX_FLAG_MMIC_STRIPPED = BIT(12),
596
RX_FLAG_NO_PSDU = BIT(13),
597
RX_FLAG_PN_VALIDATED = BIT(14),
598
RX_FLAG_RADIOTAP_HE = BIT(15),
599
RX_FLAG_RADIOTAP_HE_MU = BIT(16),
600
RX_FLAG_RADIOTAP_LSIG = BIT(17),
601
RX_FLAG_RADIOTAP_VENDOR_DATA = BIT(18),
602
RX_FLAG_NO_SIGNAL_VAL = BIT(19),
603
RX_FLAG_IV_STRIPPED = BIT(20),
604
RX_FLAG_AMPDU_IS_LAST = BIT(21),
605
RX_FLAG_AMPDU_LAST_KNOWN = BIT(22),
606
RX_FLAG_AMSDU_MORE = BIT(23),
607
/* = BIT(24), */
608
RX_FLAG_ONLY_MONITOR = BIT(25),
609
RX_FLAG_SKIP_MONITOR = BIT(26),
610
RX_FLAG_8023 = BIT(27),
611
RX_FLAG_RADIOTAP_TLV_AT_END = BIT(28),
612
/* = BIT(29), */
613
RX_FLAG_MACTIME_IS_RTAP_TS64 = BIT(30),
614
RX_FLAG_FAILED_PLCP_CRC = BIT(31),
615
};
616
617
#define IEEE80211_RX_STATUS_FLAGS_BITS \
618
"\20\1ALLOW_SAME_PN\2AMPDU_DETAILS\3AMPDU_EOF_BIT\4AMPDU_EOF_BIT_KNOWN" \
619
"\5DECRYPTED\6DUP_VALIDATED\7FAILED_FCS_CRC\10ICV_STRIPPED" \
620
"\11MACTIME_PLCP_START\12MACTIME_START\13MIC_STRIPPED" \
621
"\14MMIC_ERROR\15MMIC_STRIPPED\16NO_PSDU\17PN_VALIDATED" \
622
"\20RADIOTAP_HE\21RADIOTAP_HE_MU\22RADIOTAP_LSIG\23RADIOTAP_VENDOR_DATA" \
623
"\24NO_SIGNAL_VAL\25IV_STRIPPED\26AMPDU_IS_LAST\27AMPDU_LAST_KNOWN" \
624
"\30AMSDU_MORE\31MACTIME_END\32ONLY_MONITOR\33SKIP_MONITOR" \
625
"\348023\35RADIOTAP_TLV_AT_END\36MACTIME\37MACTIME_IS_RTAP_TS64" \
626
"\40FAILED_PLCP_CRC"
627
628
enum mac80211_rx_encoding {
629
RX_ENC_LEGACY = 0,
630
RX_ENC_HT,
631
RX_ENC_VHT,
632
RX_ENC_HE,
633
RX_ENC_EHT,
634
};
635
636
struct ieee80211_rx_status {
637
/* TODO FIXME, this is too large. Over-reduce types to u8 where possible. */
638
union {
639
uint64_t boottime_ns;
640
int64_t ack_tx_hwtstamp;
641
};
642
uint64_t mactime;
643
uint32_t device_timestamp;
644
enum ieee80211_rx_status_flags flag;
645
uint16_t freq;
646
uint8_t encoding:3, bw:4; /* enum mac80211_rx_encoding, rate_info_bw */ /* See mt76.h */
647
uint8_t ampdu_reference;
648
uint8_t band;
649
uint8_t chains;
650
int8_t chain_signal[IEEE80211_MAX_CHAINS];
651
int8_t signal;
652
uint8_t enc_flags;
653
union {
654
struct {
655
uint8_t he_ru:3; /* nl80211::enum nl80211_he_ru_alloc */
656
uint8_t he_gi:2; /* nl80211::enum nl80211_he_gi */
657
uint8_t he_dcm:1;
658
};
659
struct {
660
uint8_t ru:4; /* nl80211::enum nl80211_eht_ru_alloc */
661
uint8_t gi:2; /* nl80211::enum nl80211_eht_gi */
662
} eht;
663
};
664
bool link_valid;
665
uint8_t link_id; /* very incosistent sizes? */
666
uint8_t zero_length_psdu_type;
667
uint8_t nss;
668
uint8_t rate_idx;
669
};
670
671
struct ieee80211_tx_status {
672
struct ieee80211_sta *sta;
673
struct ieee80211_tx_info *info;
674
int64_t ack_hwtstamp;
675
676
u8 n_rates;
677
struct ieee80211_rate_status *rates;
678
679
struct sk_buff *skb;
680
struct list_head *free_list;
681
};
682
683
struct ieee80211_scan_ies {
684
/* TODO FIXME */
685
int common_ie_len;
686
int len[NUM_NL80211_BANDS];
687
uint8_t *common_ies;
688
uint8_t *ies[NUM_NL80211_BANDS];
689
};
690
691
struct ieee80211_scan_request {
692
struct ieee80211_scan_ies ies;
693
struct cfg80211_scan_request req;
694
};
695
696
struct ieee80211_txq {
697
struct ieee80211_sta *sta;
698
struct ieee80211_vif *vif;
699
int ac;
700
uint8_t tid;
701
702
/* Must stay last. */
703
uint8_t drv_priv[0] __aligned(CACHE_LINE_SIZE);
704
};
705
706
struct ieee80211_sta_rates {
707
/* XXX TODO */
708
/* XXX some _rcu thing */
709
struct {
710
uint8_t idx;
711
uint8_t count;
712
uint16_t flags;
713
} rate[4]; /* XXX what is the real number? */
714
};
715
716
struct ieee80211_sta_txpwr {
717
/* XXX TODO */
718
enum nl80211_tx_power_setting type;
719
short power;
720
};
721
722
#define IEEE80211_NUM_TIDS 16 /* net80211::WME_NUM_TID */
723
struct ieee80211_sta_agg {
724
uint16_t max_amsdu_len;
725
uint16_t max_rc_amsdu_len;
726
uint16_t max_tid_amsdu_len[IEEE80211_NUM_TIDS];
727
};
728
729
struct ieee80211_link_sta {
730
struct ieee80211_sta *sta;
731
uint8_t addr[ETH_ALEN];
732
uint8_t link_id;
733
uint32_t supp_rates[NUM_NL80211_BANDS];
734
struct ieee80211_sta_ht_cap ht_cap;
735
struct ieee80211_sta_vht_cap vht_cap;
736
struct ieee80211_sta_he_cap he_cap;
737
struct ieee80211_he_6ghz_capa he_6ghz_capa;
738
struct ieee80211_sta_eht_cap eht_cap;
739
uint8_t rx_nss;
740
enum ieee80211_sta_rx_bandwidth bandwidth;
741
enum ieee80211_smps_mode smps_mode;
742
struct ieee80211_sta_agg agg;
743
struct ieee80211_sta_txpwr txpwr;
744
};
745
746
struct ieee80211_sta {
747
/* TODO FIXME */
748
int max_amsdu_subframes;
749
int mfp, smps_mode, tdls, tdls_initiator;
750
struct ieee80211_txq *txq[IEEE80211_NUM_TIDS + 1]; /* iwlwifi: 8 and adds +1 to tid_data, net80211::IEEE80211_TID_SIZE */
751
struct ieee80211_sta_rates *rates; /* some rcu thing? */
752
uint8_t addr[ETH_ALEN];
753
uint16_t aid;
754
bool wme;
755
bool mlo;
756
uint8_t max_sp;
757
uint8_t uapsd_queues;
758
uint16_t valid_links;
759
760
struct ieee80211_link_sta deflink;
761
struct ieee80211_link_sta *link[IEEE80211_MLD_MAX_NUM_LINKS]; /* rcu? */
762
763
/* Must stay last. */
764
uint8_t drv_priv[0] __aligned(CACHE_LINE_SIZE);
765
};
766
767
struct ieee80211_tdls_ch_sw_params {
768
/* TODO FIXME */
769
int action_code, ch_sw_tm_ie, status, switch_time, switch_timeout, timestamp;
770
struct ieee80211_sta *sta;
771
struct cfg80211_chan_def *chandef;
772
struct sk_buff *tmpl_skb;
773
};
774
775
struct ieee80211_tx_control {
776
/* TODO FIXME */
777
struct ieee80211_sta *sta;
778
};
779
780
struct ieee80211_tx_queue_params {
781
/* These types are based on iwlwifi FW structs. */
782
uint16_t cw_min;
783
uint16_t cw_max;
784
uint16_t txop;
785
uint8_t aifs;
786
787
/* TODO FIXME */
788
int acm, mu_edca, uapsd;
789
struct ieee80211_he_mu_edca_param_ac_rec mu_edca_param_rec;
790
};
791
792
enum mac80211_rate_control_flags {
793
IEEE80211_TX_RC_40_MHZ_WIDTH = BIT(0),
794
IEEE80211_TX_RC_80_MHZ_WIDTH = BIT(1),
795
IEEE80211_TX_RC_160_MHZ_WIDTH = BIT(2),
796
IEEE80211_TX_RC_GREEN_FIELD = BIT(3),
797
IEEE80211_TX_RC_MCS = BIT(4),
798
IEEE80211_TX_RC_SHORT_GI = BIT(5),
799
IEEE80211_TX_RC_VHT_MCS = BIT(6),
800
IEEE80211_TX_RC_USE_SHORT_PREAMBLE = BIT(7),
801
};
802
803
struct ieee80211_tx_rate {
804
uint8_t idx;
805
uint16_t count:5,
806
flags:11; /* enum mac80211_rate_control_flags */
807
};
808
809
enum ieee80211_vif_driver_flags {
810
IEEE80211_VIF_BEACON_FILTER = BIT(0),
811
IEEE80211_VIF_SUPPORTS_CQM_RSSI = BIT(1),
812
IEEE80211_VIF_SUPPORTS_UAPSD = BIT(2),
813
#if defined(LINUXKPI_VERSION) && (LINUXKPI_VERSION < 60600) /* v6.6 */
814
IEEE80211_VIF_DISABLE_SMPS_OVERRIDE = BIT(3), /* Renamed to IEEE80211_VIF_EML_ACTIVE. */
815
#endif
816
IEEE80211_VIF_EML_ACTIVE = BIT(4),
817
IEEE80211_VIF_IGNORE_OFDMA_WIDER_BW = BIT(5),
818
IEEE80211_VIF_REMOVE_AP_AFTER_DISASSOC = BIT(6),
819
};
820
821
#define IEEE80211_BSS_ARP_ADDR_LIST_LEN 4
822
823
struct ieee80211_vif_cfg {
824
uint16_t aid;
825
uint16_t eml_cap;
826
uint16_t eml_med_sync_delay;
827
bool assoc;
828
bool ps;
829
bool idle;
830
bool ibss_joined;
831
int arp_addr_cnt;
832
size_t ssid_len;
833
uint32_t arp_addr_list[IEEE80211_BSS_ARP_ADDR_LIST_LEN]; /* big endian */
834
uint8_t ssid[IEEE80211_NWID_LEN];
835
uint8_t ap_addr[ETH_ALEN];
836
};
837
838
enum ieee80211_offload_flags {
839
IEEE80211_OFFLOAD_ENCAP_4ADDR,
840
IEEE80211_OFFLOAD_ENCAP_ENABLED,
841
IEEE80211_OFFLOAD_DECAP_ENABLED,
842
};
843
844
struct ieee80211_vif {
845
/* TODO FIXME */
846
enum nl80211_iftype type;
847
int cab_queue;
848
int offload_flags; /* enum ieee80211_offload_flags */
849
enum ieee80211_vif_driver_flags driver_flags;
850
bool p2p;
851
bool probe_req_reg;
852
uint8_t addr[ETH_ALEN];
853
struct ieee80211_vif_cfg cfg;
854
struct ieee80211_txq *txq;
855
struct ieee80211_bss_conf bss_conf;
856
struct ieee80211_bss_conf *link_conf[IEEE80211_MLD_MAX_NUM_LINKS]; /* rcu? */
857
uint8_t hw_queue[IEEE80211_NUM_ACS];
858
uint16_t active_links;
859
uint16_t valid_links;
860
struct ieee80211_vif *mbssid_tx_vif;
861
862
/* #ifdef CONFIG_MAC80211_DEBUGFS */ /* Do not change structure depending on compile-time option. */
863
struct dentry *debugfs_dir;
864
/* #endif */
865
866
/* Must stay last. */
867
uint8_t drv_priv[0] __aligned(CACHE_LINE_SIZE);
868
};
869
870
struct ieee80211_vif_chanctx_switch {
871
struct ieee80211_chanctx_conf *old_ctx, *new_ctx;
872
struct ieee80211_vif *vif;
873
struct ieee80211_bss_conf *link_conf;
874
};
875
876
struct ieee80211_prep_tx_info {
877
uint16_t duration;
878
uint16_t subtype;
879
bool success;
880
bool was_assoc;
881
int link_id;
882
};
883
884
/* XXX-BZ too big, over-reduce size to u8, and array sizes to minuimum to fit in skb->cb. */
885
/* Also warning: some sizes change by pointer size! This is 64bit only. */
886
struct ieee80211_tx_info {
887
enum ieee80211_tx_info_flags flags; /* 32 bits */
888
/* TODO FIXME */
889
enum nl80211_band band; /* 3 bits */
890
uint16_t hw_queue:4, /* 4 bits */
891
tx_time_est:10; /* 10 bits */
892
union {
893
struct {
894
struct ieee80211_tx_rate rates[4];
895
bool use_rts;
896
uint8_t antennas:2;
897
struct ieee80211_vif *vif;
898
struct ieee80211_key_conf *hw_key;
899
enum ieee80211_tx_control_flags flags;
900
} control;
901
struct {
902
struct ieee80211_tx_rate rates[4];
903
uint32_t ack_signal;
904
uint8_t ampdu_ack_len;
905
uint8_t ampdu_len;
906
uint8_t antenna;
907
uint16_t tx_time;
908
uint8_t flags;
909
void *status_driver_data[16 / sizeof(void *)]; /* XXX TODO */
910
} status;
911
#define IEEE80211_TX_INFO_DRIVER_DATA_SIZE 40
912
void *driver_data[IEEE80211_TX_INFO_DRIVER_DATA_SIZE / sizeof(void *)];
913
};
914
};
915
916
/* net80211 conflict */
917
struct linuxkpi_ieee80211_tim_ie {
918
uint8_t dtim_count;
919
uint8_t dtim_period;
920
uint8_t bitmap_ctrl;
921
uint8_t *virtual_map;
922
};
923
#define ieee80211_tim_ie linuxkpi_ieee80211_tim_ie
924
925
enum ieee80211_iface_iter {
926
IEEE80211_IFACE_ITER_NORMAL = BIT(0),
927
IEEE80211_IFACE_ITER_RESUME_ALL = BIT(1),
928
IEEE80211_IFACE_SKIP_SDATA_NOT_IN_DRIVER = BIT(2), /* seems to be an iter flag */
929
IEEE80211_IFACE_ITER_ACTIVE = BIT(3),
930
931
/* Internal flags only. */
932
IEEE80211_IFACE_ITER__ATOMIC = BIT(6),
933
IEEE80211_IFACE_ITER__MTX = BIT(8),
934
};
935
936
enum set_key_cmd {
937
SET_KEY,
938
DISABLE_KEY,
939
};
940
941
/* 802.11-2020, 9.4.2.55.2 HT Capability Information field. */
942
enum rx_enc_flags {
943
RX_ENC_FLAG_SHORTPRE = BIT(0),
944
RX_ENC_FLAG_SHORT_GI = BIT(2),
945
RX_ENC_FLAG_HT_GF = BIT(3),
946
RX_ENC_FLAG_STBC_MASK = BIT(4) | BIT(5),
947
#define RX_ENC_FLAG_STBC_SHIFT 4
948
RX_ENC_FLAG_LDPC = BIT(6),
949
RX_ENC_FLAG_BF = BIT(7),
950
};
951
952
enum sta_notify_cmd {
953
STA_NOTIFY_AWAKE,
954
STA_NOTIFY_SLEEP,
955
};
956
957
struct ieee80211_low_level_stats {
958
/* Can we make them uint64_t? */
959
uint32_t dot11ACKFailureCount;
960
uint32_t dot11FCSErrorCount;
961
uint32_t dot11RTSFailureCount;
962
uint32_t dot11RTSSuccessCount;
963
};
964
965
struct ieee80211_ops {
966
/* TODO FIXME */
967
int (*start)(struct ieee80211_hw *);
968
void (*stop)(struct ieee80211_hw *, bool);
969
970
int (*config)(struct ieee80211_hw *, int, u32);
971
void (*reconfig_complete)(struct ieee80211_hw *, enum ieee80211_reconfig_type);
972
973
void (*prep_add_interface)(struct ieee80211_hw *, enum nl80211_iftype);
974
int (*add_interface)(struct ieee80211_hw *, struct ieee80211_vif *);
975
void (*remove_interface)(struct ieee80211_hw *, struct ieee80211_vif *);
976
int (*change_interface)(struct ieee80211_hw *, struct ieee80211_vif *, enum nl80211_iftype, bool);
977
978
void (*sw_scan_start)(struct ieee80211_hw *, struct ieee80211_vif *, const u8 *);
979
void (*sw_scan_complete)(struct ieee80211_hw *, struct ieee80211_vif *);
980
int (*sched_scan_start)(struct ieee80211_hw *, struct ieee80211_vif *, struct cfg80211_sched_scan_request *, struct ieee80211_scan_ies *);
981
int (*sched_scan_stop)(struct ieee80211_hw *, struct ieee80211_vif *);
982
int (*hw_scan)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_scan_request *);
983
void (*cancel_hw_scan)(struct ieee80211_hw *, struct ieee80211_vif *);
984
985
int (*conf_tx)(struct ieee80211_hw *, struct ieee80211_vif *, u32, u16, const struct ieee80211_tx_queue_params *);
986
void (*tx)(struct ieee80211_hw *, struct ieee80211_tx_control *, struct sk_buff *);
987
int (*tx_last_beacon)(struct ieee80211_hw *);
988
void (*wake_tx_queue)(struct ieee80211_hw *, struct ieee80211_txq *);
989
990
void (*mgd_prepare_tx)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_prep_tx_info *);
991
void (*mgd_complete_tx)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_prep_tx_info *);
992
void (*mgd_protect_tdls_discover)(struct ieee80211_hw *, struct ieee80211_vif *, unsigned int);
993
994
void (*flush)(struct ieee80211_hw *, struct ieee80211_vif *, u32, bool);
995
void (*flush_sta)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *);
996
997
int (*set_frag_threshold)(struct ieee80211_hw *, int, u32);
998
999
void (*sync_rx_queues)(struct ieee80211_hw *);
1000
1001
void (*allow_buffered_frames)(struct ieee80211_hw *, struct ieee80211_sta *, u16, int, enum ieee80211_frame_release_type, bool);
1002
void (*release_buffered_frames)(struct ieee80211_hw *, struct ieee80211_sta *, u16, int, enum ieee80211_frame_release_type, bool);
1003
1004
int (*sta_add)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *);
1005
int (*sta_remove)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *);
1006
int (*sta_set_txpwr)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *);
1007
void (*sta_statistics)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *, struct station_info *);
1008
void (*sta_pre_rcu_remove)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *);
1009
int (*sta_state)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *, enum ieee80211_sta_state, enum ieee80211_sta_state);
1010
void (*sta_notify)(struct ieee80211_hw *, struct ieee80211_vif *, enum sta_notify_cmd, struct ieee80211_sta *);
1011
void (*sta_rc_update)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *, u32);
1012
void (*link_sta_rc_update)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_link_sta *, u32);
1013
void (*sta_rate_tbl_update)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *);
1014
void (*sta_set_4addr)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *, bool);
1015
void (*sta_set_decap_offload)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *, bool);
1016
1017
u64 (*prepare_multicast)(struct ieee80211_hw *, struct netdev_hw_addr_list *);
1018
1019
int (*ampdu_action)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_ampdu_params *);
1020
1021
bool (*can_aggregate_in_amsdu)(struct ieee80211_hw *, struct sk_buff *, struct sk_buff *);
1022
1023
int (*pre_channel_switch)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_channel_switch *);
1024
int (*post_channel_switch)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_bss_conf *);
1025
void (*channel_switch)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_channel_switch *);
1026
void (*channel_switch_beacon)(struct ieee80211_hw *, struct ieee80211_vif *, struct cfg80211_chan_def *);
1027
void (*abort_channel_switch)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_bss_conf *);
1028
void (*channel_switch_rx_beacon)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_channel_switch *);
1029
int (*tdls_channel_switch)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *, u8, struct cfg80211_chan_def *, struct sk_buff *, u32);
1030
void (*tdls_cancel_channel_switch)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *);
1031
void (*tdls_recv_channel_switch)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_tdls_ch_sw_params *);
1032
1033
int (*add_chanctx)(struct ieee80211_hw *, struct ieee80211_chanctx_conf *);
1034
void (*remove_chanctx)(struct ieee80211_hw *, struct ieee80211_chanctx_conf *);
1035
void (*change_chanctx)(struct ieee80211_hw *, struct ieee80211_chanctx_conf *, u32);
1036
int (*assign_vif_chanctx)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_bss_conf *, struct ieee80211_chanctx_conf *);
1037
void (*unassign_vif_chanctx)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_bss_conf *, struct ieee80211_chanctx_conf *);
1038
int (*switch_vif_chanctx)(struct ieee80211_hw *, struct ieee80211_vif_chanctx_switch *, int, enum ieee80211_chanctx_switch_mode);
1039
1040
int (*get_antenna)(struct ieee80211_hw *, int, u32 *, u32 *);
1041
int (*set_antenna)(struct ieee80211_hw *, int, u32, u32);
1042
1043
int (*remain_on_channel)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_channel *, int, enum ieee80211_roc_type);
1044
int (*cancel_remain_on_channel)(struct ieee80211_hw *, struct ieee80211_vif *);
1045
1046
void (*configure_filter)(struct ieee80211_hw *, unsigned int, unsigned int *, u64);
1047
void (*config_iface_filter)(struct ieee80211_hw *, struct ieee80211_vif *, unsigned int, unsigned int);
1048
1049
void (*bss_info_changed)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_bss_conf *, u64);
1050
void (*link_info_changed)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_bss_conf *, u64);
1051
1052
int (*set_rts_threshold)(struct ieee80211_hw *, int, u32);
1053
void (*event_callback)(struct ieee80211_hw *, struct ieee80211_vif *, const struct ieee80211_event *);
1054
int (*get_survey)(struct ieee80211_hw *, int, struct survey_info *);
1055
int (*get_ftm_responder_stats)(struct ieee80211_hw *, struct ieee80211_vif *, struct cfg80211_ftm_responder_stats *);
1056
1057
uint64_t (*get_tsf)(struct ieee80211_hw *, struct ieee80211_vif *);
1058
void (*set_tsf)(struct ieee80211_hw *, struct ieee80211_vif *, uint64_t);
1059
void (*offset_tsf)(struct ieee80211_hw *, struct ieee80211_vif *, s64);
1060
1061
int (*set_bitrate_mask)(struct ieee80211_hw *, struct ieee80211_vif *, const struct cfg80211_bitrate_mask *);
1062
void (*set_coverage_class)(struct ieee80211_hw *, int, s16);
1063
int (*set_tim)(struct ieee80211_hw *, struct ieee80211_sta *, bool);
1064
1065
int (*set_key)(struct ieee80211_hw *, enum set_key_cmd, struct ieee80211_vif *, struct ieee80211_sta *, struct ieee80211_key_conf *);
1066
void (*update_tkip_key)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_key_conf *, struct ieee80211_sta *, u32, u16 *);
1067
1068
int (*start_pmsr)(struct ieee80211_hw *, struct ieee80211_vif *, struct cfg80211_pmsr_request *);
1069
void (*abort_pmsr)(struct ieee80211_hw *, struct ieee80211_vif *, struct cfg80211_pmsr_request *);
1070
1071
int (*start_ap)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_bss_conf *link_conf);
1072
void (*stop_ap)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_bss_conf *link_conf);
1073
int (*join_ibss)(struct ieee80211_hw *, struct ieee80211_vif *);
1074
void (*leave_ibss)(struct ieee80211_hw *, struct ieee80211_vif *);
1075
1076
int (*set_sar_specs)(struct ieee80211_hw *, const struct cfg80211_sar_specs *);
1077
1078
int (*set_tid_config)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *, struct cfg80211_tid_config *);
1079
int (*reset_tid_config)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *, u8);
1080
1081
int (*get_et_sset_count)(struct ieee80211_hw *, struct ieee80211_vif *, int);
1082
void (*get_et_stats)(struct ieee80211_hw *, struct ieee80211_vif *, struct ethtool_stats *, u64 *);
1083
void (*get_et_strings)(struct ieee80211_hw *, struct ieee80211_vif *, u32, u8 *);
1084
1085
void (*update_vif_offload)(struct ieee80211_hw *, struct ieee80211_vif *);
1086
1087
int (*get_txpower)(struct ieee80211_hw *, struct ieee80211_vif *, unsigned int, int *);
1088
int (*get_stats)(struct ieee80211_hw *, struct ieee80211_low_level_stats *);
1089
1090
int (*set_radar_background)(struct ieee80211_hw *, struct cfg80211_chan_def *);
1091
1092
void (*add_twt_setup)(struct ieee80211_hw *, struct ieee80211_sta *, struct ieee80211_twt_setup *);
1093
void (*twt_teardown_request)(struct ieee80211_hw *, struct ieee80211_sta *, u8);
1094
1095
int (*set_hw_timestamp)(struct ieee80211_hw *, struct ieee80211_vif *, struct cfg80211_set_hw_timestamp *);
1096
1097
void (*vif_cfg_changed)(struct ieee80211_hw *, struct ieee80211_vif *, u64);
1098
1099
int (*change_vif_links)(struct ieee80211_hw *, struct ieee80211_vif *, u16, u16, struct ieee80211_bss_conf *[IEEE80211_MLD_MAX_NUM_LINKS]);
1100
int (*change_sta_links)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *, u16, u16);
1101
bool (*can_activate_links)(struct ieee80211_hw *, struct ieee80211_vif *, u16);
1102
enum ieee80211_neg_ttlm_res (*can_neg_ttlm)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_neg_ttlm *);
1103
1104
void (*rfkill_poll)(struct ieee80211_hw *);
1105
1106
int (*net_fill_forward_path)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *, struct net_device_path_ctx *, struct net_device_path *);
1107
1108
/* #ifdef CONFIG_MAC80211_DEBUGFS */ /* Do not change depending on compile-time option. */
1109
void (*sta_add_debugfs)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_sta *, struct dentry *);
1110
void (*vif_add_debugfs)(struct ieee80211_hw *, struct ieee80211_vif *);
1111
void (*link_sta_add_debugfs)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_link_sta *, struct dentry *);
1112
void (*link_add_debugfs)(struct ieee80211_hw *, struct ieee80211_vif *, struct ieee80211_bss_conf *, struct dentry *);
1113
/* #endif */
1114
/* #ifdef CONFIG_PM_SLEEP */ /* Do not change depending on compile-time option. */
1115
int (*suspend)(struct ieee80211_hw *, struct cfg80211_wowlan *);
1116
int (*resume)(struct ieee80211_hw *);
1117
void (*set_wakeup)(struct ieee80211_hw *, bool);
1118
void (*set_rekey_data)(struct ieee80211_hw *, struct ieee80211_vif *, struct cfg80211_gtk_rekey_data *);
1119
void (*set_default_unicast_key)(struct ieee80211_hw *, struct ieee80211_vif *, int);
1120
/* #if IS_ENABLED(CONFIG_IPV6) */
1121
void (*ipv6_addr_change)(struct ieee80211_hw *, struct ieee80211_vif *, struct inet6_dev *);
1122
/* #endif */
1123
/* #endif CONFIG_PM_SLEEP */
1124
};
1125
1126
/* -------------------------------------------------------------------------- */
1127
1128
/* linux_80211.c */
1129
extern const struct cfg80211_ops linuxkpi_mac80211cfgops;
1130
1131
struct ieee80211_hw *linuxkpi_ieee80211_alloc_hw(size_t,
1132
const struct ieee80211_ops *);
1133
void linuxkpi_ieee80211_iffree(struct ieee80211_hw *);
1134
void linuxkpi_set_ieee80211_dev(struct ieee80211_hw *);
1135
int linuxkpi_ieee80211_ifattach(struct ieee80211_hw *);
1136
void linuxkpi_ieee80211_ifdetach(struct ieee80211_hw *);
1137
void linuxkpi_ieee80211_unregister_hw(struct ieee80211_hw *);
1138
struct ieee80211_hw * linuxkpi_wiphy_to_ieee80211_hw(struct wiphy *);
1139
void linuxkpi_ieee80211_restart_hw(struct ieee80211_hw *);
1140
void linuxkpi_ieee80211_iterate_interfaces(
1141
struct ieee80211_hw *hw, enum ieee80211_iface_iter flags,
1142
void(*iterfunc)(void *, uint8_t *, struct ieee80211_vif *),
1143
void *);
1144
void linuxkpi_ieee80211_iterate_keys(struct ieee80211_hw *,
1145
struct ieee80211_vif *,
1146
void(*iterfunc)(struct ieee80211_hw *, struct ieee80211_vif *,
1147
struct ieee80211_sta *, struct ieee80211_key_conf *, void *),
1148
void *, bool);
1149
void linuxkpi_ieee80211_iterate_chan_contexts(struct ieee80211_hw *,
1150
void(*iterfunc)(struct ieee80211_hw *,
1151
struct ieee80211_chanctx_conf *, void *),
1152
void *);
1153
void linuxkpi_ieee80211_iterate_stations_atomic(struct ieee80211_hw *,
1154
void (*iterfunc)(void *, struct ieee80211_sta *), void *);
1155
void linuxkpi_ieee80211_scan_completed(struct ieee80211_hw *,
1156
struct cfg80211_scan_info *);
1157
void linuxkpi_ieee80211_rx(struct ieee80211_hw *, struct sk_buff *,
1158
struct ieee80211_sta *, struct napi_struct *, struct list_head *);
1159
uint8_t linuxkpi_ieee80211_get_tid(struct ieee80211_hdr *, bool);
1160
struct ieee80211_sta *linuxkpi_ieee80211_find_sta(struct ieee80211_vif *,
1161
const u8 *);
1162
struct ieee80211_sta *linuxkpi_ieee80211_find_sta_by_ifaddr(
1163
struct ieee80211_hw *, const uint8_t *, const uint8_t *);
1164
struct sk_buff *linuxkpi_ieee80211_tx_dequeue(struct ieee80211_hw *,
1165
struct ieee80211_txq *);
1166
bool linuxkpi_ieee80211_is_ie_id_in_ie_buf(const u8, const u8 *, size_t);
1167
bool linuxkpi_ieee80211_ie_advance(size_t *, const u8 *, size_t);
1168
void linuxkpi_ieee80211_free_txskb(struct ieee80211_hw *, struct sk_buff *,
1169
int);
1170
void linuxkpi_ieee80211_queue_delayed_work(struct ieee80211_hw *,
1171
struct delayed_work *, int);
1172
void linuxkpi_ieee80211_queue_work(struct ieee80211_hw *, struct work_struct *);
1173
struct sk_buff *linuxkpi_ieee80211_pspoll_get(struct ieee80211_hw *,
1174
struct ieee80211_vif *);
1175
struct sk_buff *linuxkpi_ieee80211_nullfunc_get(struct ieee80211_hw *,
1176
struct ieee80211_vif *, int, bool);
1177
void linuxkpi_ieee80211_txq_get_depth(struct ieee80211_txq *, unsigned long *,
1178
unsigned long *);
1179
struct wireless_dev *linuxkpi_ieee80211_vif_to_wdev(struct ieee80211_vif *);
1180
void linuxkpi_ieee80211_connection_loss(struct ieee80211_vif *);
1181
void linuxkpi_ieee80211_beacon_loss(struct ieee80211_vif *);
1182
struct sk_buff *linuxkpi_ieee80211_probereq_get(struct ieee80211_hw *,
1183
const uint8_t *, const uint8_t *, size_t, size_t);
1184
void linuxkpi_ieee80211_tx_status(struct ieee80211_hw *, struct sk_buff *);
1185
void linuxkpi_ieee80211_tx_status_ext(struct ieee80211_hw *,
1186
struct ieee80211_tx_status *);
1187
void linuxkpi_ieee80211_stop_queues(struct ieee80211_hw *);
1188
void linuxkpi_ieee80211_wake_queues(struct ieee80211_hw *);
1189
void linuxkpi_ieee80211_stop_queue(struct ieee80211_hw *, int);
1190
void linuxkpi_ieee80211_wake_queue(struct ieee80211_hw *, int);
1191
void linuxkpi_ieee80211_txq_schedule_start(struct ieee80211_hw *, uint8_t);
1192
struct ieee80211_txq *linuxkpi_ieee80211_next_txq(struct ieee80211_hw *, uint8_t);
1193
void linuxkpi_ieee80211_schedule_txq(struct ieee80211_hw *,
1194
struct ieee80211_txq *, bool);
1195
void linuxkpi_ieee80211_handle_wake_tx_queue(struct ieee80211_hw *,
1196
struct ieee80211_txq *);
1197
1198
/* -------------------------------------------------------------------------- */
1199
1200
static __inline void
1201
_ieee80211_hw_set(struct ieee80211_hw *hw, enum ieee80211_hw_flags flag)
1202
{
1203
1204
set_bit(flag, hw->flags);
1205
}
1206
1207
static __inline bool
1208
__ieee80211_hw_check(struct ieee80211_hw *hw, enum ieee80211_hw_flags flag)
1209
{
1210
1211
return (test_bit(flag, hw->flags));
1212
}
1213
1214
/* They pass in shortened flag names; how confusingly inconsistent. */
1215
#define ieee80211_hw_set(_hw, _flag) \
1216
_ieee80211_hw_set(_hw, IEEE80211_HW_ ## _flag)
1217
#define ieee80211_hw_check(_hw, _flag) \
1218
__ieee80211_hw_check(_hw, IEEE80211_HW_ ## _flag)
1219
1220
/* XXX-BZ add CTASSERTS that size of struct is <= sizeof skb->cb. */
1221
CTASSERT(sizeof(struct ieee80211_tx_info) <= sizeof(((struct sk_buff *)0)->cb));
1222
#define IEEE80211_SKB_CB(_skb) \
1223
((struct ieee80211_tx_info *)((_skb)->cb))
1224
1225
CTASSERT(sizeof(struct ieee80211_rx_status) <= sizeof(((struct sk_buff *)0)->cb));
1226
#define IEEE80211_SKB_RXCB(_skb) \
1227
((struct ieee80211_rx_status *)((_skb)->cb))
1228
1229
static __inline void
1230
ieee80211_free_hw(struct ieee80211_hw *hw)
1231
{
1232
1233
linuxkpi_ieee80211_iffree(hw);
1234
1235
if (hw->wiphy != NULL)
1236
wiphy_free(hw->wiphy);
1237
/* Note that *hw is not valid any longer after this. */
1238
1239
IMPROVE();
1240
}
1241
1242
static __inline struct ieee80211_hw *
1243
ieee80211_alloc_hw(size_t priv_len, const struct ieee80211_ops *ops)
1244
{
1245
1246
return (linuxkpi_ieee80211_alloc_hw(priv_len, ops));
1247
}
1248
1249
static __inline void
1250
SET_IEEE80211_DEV(struct ieee80211_hw *hw, struct device *dev)
1251
{
1252
1253
set_wiphy_dev(hw->wiphy, dev);
1254
linuxkpi_set_ieee80211_dev(hw);
1255
1256
IMPROVE();
1257
}
1258
1259
static __inline int
1260
ieee80211_register_hw(struct ieee80211_hw *hw)
1261
{
1262
int error;
1263
1264
error = wiphy_register(hw->wiphy);
1265
if (error != 0)
1266
return (error);
1267
1268
/*
1269
* At this point the driver has set all the options, flags, bands,
1270
* ciphers, hw address(es), ... basically mac80211/cfg80211 hw/wiphy
1271
* setup is done.
1272
* We need to replicate a lot of information from here into net80211.
1273
*/
1274
error = linuxkpi_ieee80211_ifattach(hw);
1275
1276
IMPROVE();
1277
1278
return (error);
1279
}
1280
1281
static inline void
1282
ieee80211_unregister_hw(struct ieee80211_hw *hw)
1283
{
1284
1285
linuxkpi_ieee80211_unregister_hw(hw);
1286
}
1287
1288
static __inline struct ieee80211_hw *
1289
wiphy_to_ieee80211_hw(struct wiphy *wiphy)
1290
{
1291
1292
return (linuxkpi_wiphy_to_ieee80211_hw(wiphy));
1293
}
1294
1295
static inline void
1296
ieee80211_restart_hw(struct ieee80211_hw *hw)
1297
{
1298
linuxkpi_ieee80211_restart_hw(hw);
1299
}
1300
1301
static inline void
1302
ieee80211_hw_restart_disconnect(struct ieee80211_vif *vif)
1303
{
1304
TODO();
1305
}
1306
1307
/* -------------------------------------------------------------------------- */
1308
1309
#define link_conf_dereference_check(_vif, _linkid) \
1310
rcu_dereference_check((_vif)->link_conf[_linkid], true)
1311
1312
#define link_conf_dereference_protected(_vif, _linkid) \
1313
rcu_dereference_protected((_vif)->link_conf[_linkid], true)
1314
1315
#define link_sta_dereference_check(_sta, _linkid) \
1316
rcu_dereference_check((_sta)->link[_linkid], true)
1317
1318
#define link_sta_dereference_protected(_sta, _linkid) \
1319
rcu_dereference_protected((_sta)->link[_linkid], true)
1320
1321
#define for_each_vif_active_link(_vif, _link, _linkid) \
1322
for (_linkid = 0; _linkid < nitems((_vif)->link_conf); _linkid++) \
1323
if ( ((_vif)->active_links == 0 /* no MLO */ || \
1324
((_vif)->active_links & BIT(_linkid)) != 0) && \
1325
(_link = rcu_dereference((_vif)->link_conf[_linkid])) )
1326
1327
#define for_each_sta_active_link(_vif, _sta, _linksta, _linkid) \
1328
for (_linkid = 0; _linkid < nitems((_sta)->link); _linkid++) \
1329
if ( ((_vif)->active_links == 0 /* no MLO */ || \
1330
((_vif)->active_links & BIT(_linkid)) != 0) && \
1331
(_linksta = link_sta_dereference_check((_sta), (_linkid))) )
1332
1333
/* -------------------------------------------------------------------------- */
1334
1335
static __inline bool
1336
ieee80211_vif_is_mesh(struct ieee80211_vif *vif)
1337
{
1338
TODO();
1339
return (false);
1340
}
1341
1342
1343
/* -------------------------------------------------------------------------- */
1344
/* Receive functions (air/driver to mac80211/net80211). */
1345
1346
1347
static __inline void
1348
ieee80211_rx_napi(struct ieee80211_hw *hw, struct ieee80211_sta *sta,
1349
struct sk_buff *skb, struct napi_struct *napi)
1350
{
1351
1352
linuxkpi_ieee80211_rx(hw, skb, sta, napi, NULL);
1353
}
1354
1355
static __inline void
1356
ieee80211_rx_list(struct ieee80211_hw *hw, struct ieee80211_sta *sta,
1357
struct sk_buff *skb, struct list_head *list)
1358
{
1359
1360
linuxkpi_ieee80211_rx(hw, skb, sta, NULL, list);
1361
}
1362
1363
static __inline void
1364
ieee80211_rx_ni(struct ieee80211_hw *hw, struct sk_buff *skb)
1365
{
1366
1367
linuxkpi_ieee80211_rx(hw, skb, NULL, NULL, NULL);
1368
}
1369
1370
static __inline void
1371
ieee80211_rx_irqsafe(struct ieee80211_hw *hw, struct sk_buff *skb)
1372
{
1373
1374
linuxkpi_ieee80211_rx(hw, skb, NULL, NULL, NULL);
1375
}
1376
1377
static __inline void
1378
ieee80211_rx(struct ieee80211_hw *hw, struct sk_buff *skb)
1379
{
1380
1381
linuxkpi_ieee80211_rx(hw, skb, NULL, NULL, NULL);
1382
}
1383
1384
/* -------------------------------------------------------------------------- */
1385
1386
static inline void
1387
ieee80211_stop_queues(struct ieee80211_hw *hw)
1388
{
1389
linuxkpi_ieee80211_stop_queues(hw);
1390
}
1391
1392
static inline void
1393
ieee80211_wake_queues(struct ieee80211_hw *hw)
1394
{
1395
linuxkpi_ieee80211_wake_queues(hw);
1396
}
1397
1398
static inline void
1399
ieee80211_stop_queue(struct ieee80211_hw *hw, int qnum)
1400
{
1401
linuxkpi_ieee80211_stop_queue(hw, qnum);
1402
}
1403
1404
static inline void
1405
ieee80211_wake_queue(struct ieee80211_hw *hw, int qnum)
1406
{
1407
linuxkpi_ieee80211_wake_queue(hw, qnum);
1408
}
1409
1410
static inline void
1411
ieee80211_schedule_txq(struct ieee80211_hw *hw, struct ieee80211_txq *txq)
1412
{
1413
linuxkpi_ieee80211_schedule_txq(hw, txq, true);
1414
}
1415
1416
static inline void
1417
ieee80211_return_txq(struct ieee80211_hw *hw, struct ieee80211_txq *txq,
1418
bool withoutpkts)
1419
{
1420
linuxkpi_ieee80211_schedule_txq(hw, txq, withoutpkts);
1421
}
1422
1423
static inline void
1424
ieee80211_txq_schedule_start(struct ieee80211_hw *hw, uint8_t ac)
1425
{
1426
linuxkpi_ieee80211_txq_schedule_start(hw, ac);
1427
}
1428
1429
static inline void
1430
ieee80211_txq_schedule_end(struct ieee80211_hw *hw, uint8_t ac)
1431
{
1432
/* DO_NADA; */
1433
}
1434
1435
static inline struct ieee80211_txq *
1436
ieee80211_next_txq(struct ieee80211_hw *hw, uint8_t ac)
1437
{
1438
return (linuxkpi_ieee80211_next_txq(hw, ac));
1439
}
1440
1441
static inline void
1442
ieee80211_handle_wake_tx_queue(struct ieee80211_hw *hw,
1443
struct ieee80211_txq *txq)
1444
{
1445
linuxkpi_ieee80211_handle_wake_tx_queue(hw, txq);
1446
}
1447
1448
static inline void
1449
ieee80211_purge_tx_queue(struct ieee80211_hw *hw,
1450
struct sk_buff_head *skbs)
1451
{
1452
TODO();
1453
}
1454
1455
/* -------------------------------------------------------------------------- */
1456
1457
static __inline uint8_t
1458
ieee80211_get_tid(struct ieee80211_hdr *hdr)
1459
{
1460
1461
return (linuxkpi_ieee80211_get_tid(hdr, false));
1462
}
1463
1464
static __inline struct sk_buff *
1465
ieee80211_beacon_get_tim(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
1466
uint16_t *tim_offset, uint16_t *tim_len, uint32_t link_id)
1467
{
1468
1469
if (tim_offset != NULL)
1470
*tim_offset = 0;
1471
if (tim_len != NULL)
1472
*tim_len = 0;
1473
TODO();
1474
return (NULL);
1475
}
1476
1477
static __inline void
1478
ieee80211_iterate_active_interfaces_atomic(struct ieee80211_hw *hw,
1479
enum ieee80211_iface_iter flags,
1480
void(*iterfunc)(void *, uint8_t *, struct ieee80211_vif *),
1481
void *arg)
1482
{
1483
1484
flags |= IEEE80211_IFACE_ITER__ATOMIC;
1485
flags |= IEEE80211_IFACE_ITER_ACTIVE;
1486
linuxkpi_ieee80211_iterate_interfaces(hw, flags, iterfunc, arg);
1487
}
1488
1489
static __inline void
1490
ieee80211_iterate_active_interfaces(struct ieee80211_hw *hw,
1491
enum ieee80211_iface_iter flags,
1492
void(*iterfunc)(void *, uint8_t *, struct ieee80211_vif *),
1493
void *arg)
1494
{
1495
1496
flags |= IEEE80211_IFACE_ITER_ACTIVE;
1497
linuxkpi_ieee80211_iterate_interfaces(hw, flags, iterfunc, arg);
1498
}
1499
1500
static __inline void
1501
ieee80211_iterate_active_interfaces_mtx(struct ieee80211_hw *hw,
1502
enum ieee80211_iface_iter flags,
1503
void(*iterfunc)(void *, uint8_t *, struct ieee80211_vif *),
1504
void *arg)
1505
{
1506
flags |= IEEE80211_IFACE_ITER_ACTIVE;
1507
flags |= IEEE80211_IFACE_ITER__MTX;
1508
linuxkpi_ieee80211_iterate_interfaces(hw, flags, iterfunc, arg);
1509
}
1510
1511
static __inline void
1512
ieee80211_iterate_interfaces(struct ieee80211_hw *hw,
1513
enum ieee80211_iface_iter flags,
1514
void (*iterfunc)(void *, uint8_t *, struct ieee80211_vif *),
1515
void *arg)
1516
{
1517
1518
linuxkpi_ieee80211_iterate_interfaces(hw, flags, iterfunc, arg);
1519
}
1520
1521
static inline void
1522
ieee80211_iter_keys(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
1523
void(*iterfunc)(struct ieee80211_hw *, struct ieee80211_vif *,
1524
struct ieee80211_sta *, struct ieee80211_key_conf *, void *),
1525
void *arg)
1526
{
1527
linuxkpi_ieee80211_iterate_keys(hw, vif, iterfunc, arg, false);
1528
}
1529
1530
static inline void
1531
ieee80211_iter_keys_rcu(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
1532
void(*iterfunc)(struct ieee80211_hw *, struct ieee80211_vif *,
1533
struct ieee80211_sta *, struct ieee80211_key_conf *, void *),
1534
void *arg)
1535
{
1536
linuxkpi_ieee80211_iterate_keys(hw, vif, iterfunc, arg, true);
1537
}
1538
1539
static __inline void
1540
ieee80211_iter_chan_contexts_atomic(struct ieee80211_hw *hw,
1541
void(*iterfunc)(struct ieee80211_hw *, struct ieee80211_chanctx_conf *, void *),
1542
void *arg)
1543
{
1544
1545
linuxkpi_ieee80211_iterate_chan_contexts(hw, iterfunc, arg);
1546
}
1547
1548
static __inline void
1549
ieee80211_iter_chan_contexts_mtx(struct ieee80211_hw *hw,
1550
void (*iterfunc)(struct ieee80211_hw *, struct ieee80211_chanctx_conf *, void *),
1551
void *arg)
1552
{
1553
IMPROVE("XXX LKPI80211 TODO MTX\n");
1554
linuxkpi_ieee80211_iterate_chan_contexts(hw, iterfunc, arg);
1555
}
1556
1557
static __inline void
1558
ieee80211_iterate_stations_atomic(struct ieee80211_hw *hw,
1559
void (*iterfunc)(void *, struct ieee80211_sta *), void *arg)
1560
{
1561
1562
linuxkpi_ieee80211_iterate_stations_atomic(hw, iterfunc, arg);
1563
}
1564
1565
static __inline struct wireless_dev *
1566
ieee80211_vif_to_wdev(struct ieee80211_vif *vif)
1567
{
1568
1569
return (linuxkpi_ieee80211_vif_to_wdev(vif));
1570
}
1571
1572
static __inline struct sk_buff *
1573
ieee80211_beacon_get_template(struct ieee80211_hw *hw,
1574
struct ieee80211_vif *vif, struct ieee80211_mutable_offsets *offs,
1575
uint32_t link_id)
1576
{
1577
TODO();
1578
return (NULL);
1579
}
1580
1581
static __inline void
1582
ieee80211_beacon_loss(struct ieee80211_vif *vif)
1583
{
1584
linuxkpi_ieee80211_beacon_loss(vif);
1585
}
1586
1587
static __inline void
1588
ieee80211_chswitch_done(struct ieee80211_vif *vif, bool t, uint32_t link_id)
1589
{
1590
TODO();
1591
}
1592
1593
static __inline bool
1594
ieee80211_csa_is_complete(struct ieee80211_vif *vif)
1595
{
1596
TODO();
1597
return (false);
1598
}
1599
1600
static __inline void
1601
ieee80211_csa_set_counter(struct ieee80211_vif *vif, uint8_t counter)
1602
{
1603
TODO();
1604
}
1605
1606
static __inline int
1607
ieee80211_csa_update_counter(struct ieee80211_vif *vif)
1608
{
1609
TODO();
1610
return (-1);
1611
}
1612
1613
static __inline void
1614
ieee80211_csa_finish(struct ieee80211_vif *vif, uint32_t link_id)
1615
{
1616
TODO();
1617
}
1618
1619
static inline enum nl80211_iftype
1620
ieee80211_vif_type_p2p(struct ieee80211_vif *vif)
1621
{
1622
1623
/* If we are not p2p enabled, just return the type. */
1624
if (!vif->p2p)
1625
return (vif->type);
1626
1627
/* If we are p2p, depending on side, return type. */
1628
switch (vif->type) {
1629
case NL80211_IFTYPE_AP:
1630
return (NL80211_IFTYPE_P2P_GO);
1631
case NL80211_IFTYPE_STATION:
1632
return (NL80211_IFTYPE_P2P_CLIENT);
1633
default:
1634
fallthrough;
1635
}
1636
return (vif->type);
1637
}
1638
1639
static __inline unsigned long
1640
ieee80211_tu_to_usec(unsigned long tu)
1641
{
1642
1643
return (tu * IEEE80211_DUR_TU);
1644
}
1645
1646
/*
1647
* Below we assume that the two values from different emums are the same.
1648
* Make sure this does not accidentally change.
1649
*/
1650
CTASSERT((int)IEEE80211_ACTION_SM_TPCREP == (int)IEEE80211_ACTION_RADIO_MEASUREMENT_LMREP);
1651
1652
static __inline bool
1653
ieee80211_action_contains_tpc(struct sk_buff *skb)
1654
{
1655
struct ieee80211_mgmt *mgmt;
1656
1657
mgmt = (struct ieee80211_mgmt *)skb->data;
1658
1659
/* Check that this is a mgmt/action frame? */
1660
if (!ieee80211_is_action(mgmt->frame_control))
1661
return (false);
1662
1663
/*
1664
* This is a bit convoluted but according to docs both actions
1665
* are checked for this. Kind-of makes sense for the only consumer
1666
* (iwlwifi) I am aware off given the txpower fields are at the
1667
* same location so firmware can update the value.
1668
*/
1669
/* 80211-2020 9.6.2 Spectrum Management Action frames */
1670
/* 80211-2020 9.6.2.5 TPC Report frame format */
1671
/* 80211-2020 9.6.6 Radio Measurement action details */
1672
/* 80211-2020 9.6.6.4 Link Measurement Report frame format */
1673
/* Check that it is Spectrum Management or Radio Measurement? */
1674
if (mgmt->u.action.category != IEEE80211_ACTION_CAT_SM &&
1675
mgmt->u.action.category != IEEE80211_ACTION_CAT_RADIO_MEASUREMENT)
1676
return (false);
1677
1678
/*
1679
* Check that it is TPC Report or Link Measurement Report?
1680
* The values of each are the same (see CTASSERT above function).
1681
*/
1682
if (mgmt->u.action.u.tpc_report.spec_mgmt != IEEE80211_ACTION_SM_TPCREP)
1683
return (false);
1684
1685
/* 80211-2020 9.4.2.16 TPC Report element */
1686
/* Check that the ELEMID and length are correct? */
1687
if (mgmt->u.action.u.tpc_report.tpc_elem_id != IEEE80211_ELEMID_TPCREP ||
1688
mgmt->u.action.u.tpc_report.tpc_elem_length != 4)
1689
return (false);
1690
1691
/* All the right fields in the right place. */
1692
return (true);
1693
}
1694
1695
static __inline void
1696
ieee80211_connection_loss(struct ieee80211_vif *vif)
1697
{
1698
1699
linuxkpi_ieee80211_connection_loss(vif);
1700
}
1701
1702
static __inline struct ieee80211_sta *
1703
ieee80211_find_sta(struct ieee80211_vif *vif, const u8 *peer)
1704
{
1705
1706
return (linuxkpi_ieee80211_find_sta(vif, peer));
1707
}
1708
1709
static __inline struct ieee80211_sta *
1710
ieee80211_find_sta_by_ifaddr(struct ieee80211_hw *hw, const uint8_t *addr,
1711
const uint8_t *ourvifaddr)
1712
{
1713
1714
return (linuxkpi_ieee80211_find_sta_by_ifaddr(hw, addr, ourvifaddr));
1715
}
1716
1717
static __inline size_t
1718
ieee80211_ie_split(const u8 *ies, size_t ies_len,
1719
const u8 *ie_ids, size_t ie_ids_len, size_t start)
1720
{
1721
size_t x;
1722
1723
x = start;
1724
1725
/* XXX FIXME, we need to deal with "Element ID Extension" */
1726
while (x < ies_len) {
1727
1728
/* Is this IE[s] one of the ie_ids? */
1729
if (!linuxkpi_ieee80211_is_ie_id_in_ie_buf(ies[x],
1730
ie_ids, ie_ids_len))
1731
break;
1732
1733
if (!linuxkpi_ieee80211_ie_advance(&x, ies, ies_len))
1734
break;
1735
}
1736
1737
return (x);
1738
}
1739
1740
static __inline void
1741
ieee80211_request_smps(struct ieee80211_vif *vif, u_int link_id,
1742
enum ieee80211_smps_mode smps)
1743
{
1744
static const char *smps_mode_name[] = {
1745
"SMPS_OFF",
1746
"SMPS_STATIC",
1747
"SMPS_DYNAMIC",
1748
"SMPS_AUTOMATIC",
1749
};
1750
1751
if (vif->type != NL80211_IFTYPE_STATION)
1752
return;
1753
1754
if (smps >= nitems(smps_mode_name))
1755
panic("%s: unsupported smps value: %d\n", __func__, smps);
1756
1757
IMPROVE("XXX LKPI80211 TODO smps %d %s\n", smps, smps_mode_name[smps]);
1758
}
1759
1760
static __inline void
1761
ieee80211_tdls_oper_request(struct ieee80211_vif *vif, uint8_t *addr,
1762
enum nl80211_tdls_operation oper, enum ieee80211_reason_code code,
1763
gfp_t gfp)
1764
{
1765
TODO();
1766
}
1767
1768
static __inline void
1769
wiphy_rfkill_set_hw_state(struct wiphy *wiphy, bool state)
1770
{
1771
TODO();
1772
}
1773
1774
static __inline void
1775
ieee80211_free_txskb(struct ieee80211_hw *hw, struct sk_buff *skb)
1776
{
1777
IMPROVE();
1778
1779
/*
1780
* This is called on transmit failure.
1781
* Use a not-so-random random high status error so we can distinguish
1782
* it from normal low values flying around in net80211 ("ETX").
1783
*/
1784
linuxkpi_ieee80211_free_txskb(hw, skb, 0x455458);
1785
}
1786
1787
static __inline void
1788
ieee80211_ready_on_channel(struct ieee80211_hw *hw)
1789
{
1790
TODO();
1791
/* XXX-BZ We need to see that. */
1792
}
1793
1794
static __inline void
1795
ieee80211_remain_on_channel_expired(struct ieee80211_hw *hw)
1796
{
1797
TODO();
1798
}
1799
1800
static __inline void
1801
ieee80211_cqm_rssi_notify(struct ieee80211_vif *vif,
1802
enum nl80211_cqm_rssi_threshold_event crte, int sig, gfp_t gfp)
1803
{
1804
TODO();
1805
}
1806
1807
/* -------------------------------------------------------------------------- */
1808
1809
static inline bool
1810
ieee80211_sn_less(uint16_t sn1, uint16_t sn2)
1811
{
1812
return (IEEE80211_SEQ_BA_BEFORE(sn1, sn2));
1813
}
1814
1815
static inline uint16_t
1816
ieee80211_sn_inc(uint16_t sn)
1817
{
1818
return (IEEE80211_SEQ_INC(sn));
1819
}
1820
1821
static inline uint16_t
1822
ieee80211_sn_add(uint16_t sn, uint16_t a)
1823
{
1824
return (IEEE80211_SEQ_ADD(sn, a));
1825
}
1826
1827
static inline uint16_t
1828
ieee80211_sn_sub(uint16_t sa, uint16_t sb)
1829
{
1830
return (IEEE80211_SEQ_SUB(sa, sb));
1831
}
1832
1833
static __inline void
1834
ieee80211_mark_rx_ba_filtered_frames(struct ieee80211_sta *sta, uint8_t tid,
1835
uint32_t ssn, uint64_t bitmap, uint16_t received_mpdu)
1836
{
1837
TODO();
1838
}
1839
1840
static __inline void
1841
ieee80211_stop_rx_ba_session(struct ieee80211_vif *vif, uint32_t x, uint8_t *addr)
1842
{
1843
TODO();
1844
}
1845
1846
static __inline void
1847
ieee80211_rx_ba_timer_expired(struct ieee80211_vif *vif, uint8_t *addr,
1848
uint8_t tid)
1849
{
1850
TODO();
1851
}
1852
1853
static __inline void
1854
ieee80211_start_rx_ba_session_offl(struct ieee80211_vif *vif, uint8_t *addr,
1855
uint8_t tid)
1856
{
1857
TODO();
1858
}
1859
1860
static __inline void
1861
ieee80211_stop_rx_ba_session_offl(struct ieee80211_vif *vif, uint8_t *addr,
1862
uint8_t tid)
1863
{
1864
TODO();
1865
}
1866
1867
/* -------------------------------------------------------------------------- */
1868
1869
static inline void
1870
ieee80211_rate_set_vht(struct ieee80211_tx_rate *r, uint8_t mcs, uint8_t nss)
1871
{
1872
1873
/* XXX-BZ make it KASSERTS? */
1874
if (((mcs & 0xF0) != 0) || (((nss - 1) & 0xf8) != 0)) {
1875
printf("%s:%d: mcs %#04x nss %#04x invalid\n",
1876
__func__, __LINE__, mcs, nss);
1877
return;
1878
}
1879
1880
r->idx = mcs;
1881
r->idx |= ((nss - 1) << 4);
1882
}
1883
1884
static inline uint8_t
1885
ieee80211_rate_get_vht_nss(const struct ieee80211_tx_rate *r)
1886
{
1887
return (((r->idx >> 4) & 0x07) + 1);
1888
}
1889
1890
static inline uint8_t
1891
ieee80211_rate_get_vht_mcs(const struct ieee80211_tx_rate *r)
1892
{
1893
return (r->idx & 0x0f);
1894
}
1895
1896
static inline int
1897
ieee80211_get_vht_max_nss(struct ieee80211_vht_cap *vht_cap,
1898
enum ieee80211_vht_chanwidth chanwidth, /* defined in net80211. */
1899
int mcs /* always 0 */, bool ext_nss_bw_cap /* always true */, int max_nss)
1900
{
1901
enum ieee80211_vht_mcs_support mcs_s;
1902
uint32_t supp_cw, ext_nss_bw;
1903
1904
switch (mcs) {
1905
case 0 ... 7:
1906
mcs_s = IEEE80211_VHT_MCS_SUPPORT_0_7;
1907
break;
1908
case 8:
1909
mcs_s = IEEE80211_VHT_MCS_SUPPORT_0_8;
1910
break;
1911
case 9:
1912
mcs_s = IEEE80211_VHT_MCS_SUPPORT_0_9;
1913
break;
1914
default:
1915
printf("%s: unsupported mcs value %d\n", __func__, mcs);
1916
return (0);
1917
}
1918
1919
if (max_nss == 0) {
1920
uint16_t map;
1921
1922
map = le16toh(vht_cap->supp_mcs.rx_mcs_map);
1923
for (int i = 7; i >= 0; i--) {
1924
uint8_t val;
1925
1926
val = (map >> (2 * i)) & 0x03;
1927
if (val == IEEE80211_VHT_MCS_NOT_SUPPORTED)
1928
continue;
1929
if (val >= mcs_s) {
1930
max_nss = i + 1;
1931
break;
1932
}
1933
}
1934
}
1935
1936
if (max_nss == 0)
1937
return (0);
1938
1939
if ((le16toh(vht_cap->supp_mcs.tx_mcs_map) &
1940
IEEE80211_VHT_EXT_NSS_BW_CAPABLE) == 0)
1941
return (max_nss);
1942
1943
supp_cw = le32_get_bits(vht_cap->vht_cap_info,
1944
IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK);
1945
ext_nss_bw = le32_get_bits(vht_cap->vht_cap_info,
1946
IEEE80211_VHT_CAP_EXT_NSS_BW_MASK);
1947
1948
/* If requested as ext nss not supported assume ext_nss_bw 0. */
1949
if (!ext_nss_bw_cap)
1950
ext_nss_bw = 0;
1951
1952
/*
1953
* Cover 802.11-2016, Table 9-250.
1954
*/
1955
1956
/* Unsupported settings. */
1957
if (supp_cw == 3)
1958
return (0);
1959
if (supp_cw == 2 && (ext_nss_bw == 1 || ext_nss_bw == 2))
1960
return (0);
1961
1962
/* Settings with factor != 1 or unsupported. */
1963
switch (chanwidth) {
1964
case IEEE80211_VHT_CHANWIDTH_80P80MHZ:
1965
if (supp_cw == 0 && (ext_nss_bw == 0 || ext_nss_bw == 1))
1966
return (0);
1967
if (supp_cw == 1 && ext_nss_bw == 0)
1968
return (0);
1969
if ((supp_cw == 0 || supp_cw == 1) && ext_nss_bw == 2)
1970
return (max_nss / 2);
1971
if ((supp_cw == 0 || supp_cw == 1) && ext_nss_bw == 3)
1972
return (3 * max_nss / 4);
1973
break;
1974
case IEEE80211_VHT_CHANWIDTH_160MHZ:
1975
if (supp_cw == 0 && ext_nss_bw == 0)
1976
return (0);
1977
if (supp_cw == 0 && (ext_nss_bw == 1 || ext_nss_bw == 2))
1978
return (max_nss / 2);
1979
if (supp_cw == 0 && ext_nss_bw == 3)
1980
return (3 * max_nss / 4);
1981
if (supp_cw == 1 && ext_nss_bw == 3)
1982
return (2 * max_nss);
1983
break;
1984
case IEEE80211_VHT_CHANWIDTH_80MHZ:
1985
case IEEE80211_VHT_CHANWIDTH_USE_HT:
1986
if ((supp_cw == 1 || supp_cw == 2) && ext_nss_bw == 3)
1987
return (2 * max_nss);
1988
break;
1989
}
1990
1991
/* Everything else has a factor of 1. */
1992
return (max_nss);
1993
}
1994
1995
1996
static __inline void
1997
ieee80211_reserve_tid(struct ieee80211_sta *sta, uint8_t tid)
1998
{
1999
TODO();
2000
}
2001
2002
static __inline void
2003
ieee80211_unreserve_tid(struct ieee80211_sta *sta, uint8_t tid)
2004
{
2005
TODO();
2006
}
2007
2008
static __inline void
2009
ieee80211_send_eosp_nullfunc(struct ieee80211_sta *sta, uint8_t tid)
2010
{
2011
TODO();
2012
}
2013
2014
static __inline void
2015
ieee80211_sta_block_awake(struct ieee80211_hw *hw, struct ieee80211_sta *sta,
2016
bool disable)
2017
{
2018
TODO();
2019
}
2020
2021
static __inline void
2022
ieee80211_sta_ps_transition(struct ieee80211_sta *sta, bool sleeping)
2023
{
2024
TODO();
2025
}
2026
2027
static __inline void
2028
ieee80211_sta_pspoll(struct ieee80211_sta *sta)
2029
{
2030
TODO();
2031
}
2032
2033
static inline void
2034
ieee80211_sta_recalc_aggregates(struct ieee80211_sta *sta)
2035
{
2036
if (sta->valid_links) {
2037
TODO();
2038
}
2039
}
2040
2041
static __inline void
2042
ieee80211_sta_uapsd_trigger(struct ieee80211_sta *sta, int ntids)
2043
{
2044
TODO();
2045
}
2046
2047
static inline struct sk_buff *
2048
ieee80211_tx_dequeue(struct ieee80211_hw *hw, struct ieee80211_txq *txq)
2049
{
2050
2051
return (linuxkpi_ieee80211_tx_dequeue(hw, txq));
2052
}
2053
2054
static inline struct sk_buff *
2055
ieee80211_tx_dequeue_ni(struct ieee80211_hw *hw, struct ieee80211_txq *txq)
2056
{
2057
struct sk_buff *skb;
2058
2059
local_bh_disable();
2060
skb = linuxkpi_ieee80211_tx_dequeue(hw, txq);
2061
local_bh_enable();
2062
2063
return (skb);
2064
}
2065
2066
static __inline void
2067
ieee80211_update_mu_groups(struct ieee80211_vif *vif,
2068
u_int link_id, const uint8_t *ms, const uint8_t *up)
2069
{
2070
TODO();
2071
}
2072
2073
static __inline void
2074
ieee80211_sta_set_buffered(struct ieee80211_sta *sta, uint8_t tid, bool t)
2075
{
2076
TODO();
2077
}
2078
2079
static __inline void
2080
ieee80211_sched_scan_results(struct ieee80211_hw *hw)
2081
{
2082
TODO();
2083
}
2084
2085
static __inline void
2086
ieee80211_sta_eosp(struct ieee80211_sta *sta)
2087
{
2088
TODO();
2089
}
2090
2091
static __inline int
2092
ieee80211_start_tx_ba_session(struct ieee80211_sta *sta, uint8_t tid, int x)
2093
{
2094
TODO("rtw8x");
2095
return (-EINVAL);
2096
}
2097
2098
static __inline int
2099
ieee80211_stop_tx_ba_session(struct ieee80211_sta *sta, uint8_t tid)
2100
{
2101
TODO("rtw89");
2102
return (-EINVAL);
2103
}
2104
2105
static __inline void
2106
ieee80211_start_tx_ba_cb_irqsafe(struct ieee80211_vif *vif, uint8_t *addr,
2107
uint8_t tid)
2108
{
2109
TODO("iwlwifi");
2110
}
2111
2112
static __inline void
2113
ieee80211_stop_tx_ba_cb_irqsafe(struct ieee80211_vif *vif, uint8_t *addr,
2114
uint8_t tid)
2115
{
2116
TODO("iwlwifi/rtw8x/...");
2117
}
2118
2119
static __inline void
2120
ieee80211_sched_scan_stopped(struct ieee80211_hw *hw)
2121
{
2122
TODO();
2123
}
2124
2125
static __inline void
2126
ieee80211_scan_completed(struct ieee80211_hw *hw,
2127
struct cfg80211_scan_info *info)
2128
{
2129
2130
linuxkpi_ieee80211_scan_completed(hw, info);
2131
}
2132
2133
static __inline struct sk_buff *
2134
ieee80211_beacon_get(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
2135
uint32_t link_id)
2136
{
2137
TODO();
2138
return (NULL);
2139
}
2140
2141
static __inline struct sk_buff *
2142
ieee80211_pspoll_get(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
2143
{
2144
2145
/* Only STA needs this. Otherwise return NULL and panic bad drivers. */
2146
if (vif->type != NL80211_IFTYPE_STATION)
2147
return (NULL);
2148
2149
return (linuxkpi_ieee80211_pspoll_get(hw, vif));
2150
}
2151
2152
static __inline struct sk_buff *
2153
ieee80211_proberesp_get(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
2154
{
2155
TODO();
2156
return (NULL);
2157
}
2158
2159
static __inline struct sk_buff *
2160
ieee80211_nullfunc_get(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
2161
int linkid, bool qos)
2162
{
2163
2164
/* Only STA needs this. Otherwise return NULL and panic bad drivers. */
2165
if (vif->type != NL80211_IFTYPE_STATION)
2166
return (NULL);
2167
2168
return (linuxkpi_ieee80211_nullfunc_get(hw, vif, linkid, qos));
2169
}
2170
2171
static __inline struct sk_buff *
2172
ieee80211_probereq_get(struct ieee80211_hw *hw, const uint8_t *addr,
2173
const uint8_t *ssid, size_t ssid_len, size_t tailroom)
2174
{
2175
2176
return (linuxkpi_ieee80211_probereq_get(hw, addr, ssid, ssid_len,
2177
tailroom));
2178
}
2179
2180
static __inline void
2181
ieee80211_queue_delayed_work(struct ieee80211_hw *hw, struct delayed_work *w,
2182
int delay)
2183
{
2184
2185
linuxkpi_ieee80211_queue_delayed_work(hw, w, delay);
2186
}
2187
2188
static __inline void
2189
ieee80211_queue_work(struct ieee80211_hw *hw, struct work_struct *w)
2190
{
2191
2192
linuxkpi_ieee80211_queue_work(hw, w);
2193
}
2194
2195
static __inline bool
2196
ieee80211_tx_prepare_skb(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
2197
struct sk_buff *skb, enum nl80211_band band, struct ieee80211_sta **sta)
2198
{
2199
TODO();
2200
return (false);
2201
}
2202
2203
static __inline void
2204
ieee80211_tx_status_skb(struct ieee80211_hw *hw, struct sk_buff *skb)
2205
{
2206
linuxkpi_ieee80211_tx_status(hw, skb);
2207
}
2208
2209
static inline void
2210
ieee80211_tx_status_noskb(struct ieee80211_hw *hw, struct ieee80211_sta *sta,
2211
struct ieee80211_tx_info *info)
2212
{
2213
TODO();
2214
}
2215
2216
static __inline void
2217
ieee80211_tx_status_irqsafe(struct ieee80211_hw *hw, struct sk_buff *skb)
2218
{
2219
IMPROVE();
2220
linuxkpi_ieee80211_tx_status(hw, skb);
2221
}
2222
2223
static __inline void
2224
ieee80211_tx_status_ni(struct ieee80211_hw *hw, struct sk_buff *skb)
2225
{
2226
IMPROVE();
2227
linuxkpi_ieee80211_tx_status(hw, skb);
2228
}
2229
2230
static __inline void
2231
ieee80211_tx_status_ext(struct ieee80211_hw *hw,
2232
struct ieee80211_tx_status *txstat)
2233
{
2234
2235
linuxkpi_ieee80211_tx_status_ext(hw, txstat);
2236
}
2237
2238
static __inline void
2239
ieee80211_tx_info_clear_status(struct ieee80211_tx_info *info)
2240
{
2241
int i;
2242
2243
/*
2244
* Apparently clearing flags and some other fields is not right.
2245
* Given the function is called "status" we work on that part of
2246
* the union.
2247
*/
2248
for (i = 0; i < nitems(info->status.rates); i++)
2249
info->status.rates[i].count = 0;
2250
/*
2251
* Unclear if ack_signal should be included or not but we clear the
2252
* "valid" bool so this field is no longer valid.
2253
*/
2254
memset(&info->status.ack_signal, 0, sizeof(*info) -
2255
offsetof(struct ieee80211_tx_info, status.ack_signal));
2256
}
2257
2258
static __inline void
2259
ieee80211_txq_get_depth(struct ieee80211_txq *txq, unsigned long *frame_cnt,
2260
unsigned long *byte_cnt)
2261
{
2262
2263
if (frame_cnt == NULL && byte_cnt == NULL)
2264
return;
2265
2266
linuxkpi_ieee80211_txq_get_depth(txq, frame_cnt, byte_cnt);
2267
}
2268
2269
static __inline void
2270
SET_IEEE80211_PERM_ADDR (struct ieee80211_hw *hw, uint8_t *addr)
2271
{
2272
2273
ether_addr_copy(hw->wiphy->perm_addr, addr);
2274
}
2275
2276
static __inline void
2277
ieee80211_report_low_ack(struct ieee80211_sta *sta, int x)
2278
{
2279
TODO();
2280
}
2281
2282
static __inline void
2283
ieee80211_tx_rate_update(struct ieee80211_hw *hw, struct ieee80211_sta *sta,
2284
struct ieee80211_tx_info *info)
2285
{
2286
TODO();
2287
}
2288
2289
static __inline bool
2290
ieee80211_txq_may_transmit(struct ieee80211_hw *hw, struct ieee80211_txq *txq)
2291
{
2292
TODO();
2293
return (false);
2294
}
2295
2296
static __inline void
2297
ieee80211_radar_detected(struct ieee80211_hw *hw,
2298
struct ieee80211_chanctx_conf *chanctx_conf)
2299
{
2300
TODO();
2301
}
2302
2303
static __inline void
2304
ieee80211_sta_register_airtime(struct ieee80211_sta *sta,
2305
uint8_t tid, uint32_t duration, int x)
2306
{
2307
IMPROVE("NL80211_EXT_FEATURE_AIRTIME_FAIRNESS and TX queus");
2308
}
2309
2310
static __inline void
2311
ieee80211_beacon_set_cntdwn(struct ieee80211_vif *vif, u8 counter)
2312
{
2313
TODO();
2314
}
2315
2316
static __inline int
2317
ieee80211_beacon_update_cntdwn(struct ieee80211_vif *vif, uint32_t link_id)
2318
{
2319
TODO();
2320
return (-1);
2321
}
2322
2323
static __inline bool
2324
ieee80211_beacon_cntdwn_is_complete(struct ieee80211_vif *vif, uint32_t link_id)
2325
{
2326
TODO();
2327
return (true);
2328
}
2329
2330
static __inline void
2331
ieee80211_disconnect(struct ieee80211_vif *vif, bool _x)
2332
{
2333
TODO();
2334
}
2335
2336
static __inline void
2337
ieee80211_channel_switch_disconnect(struct ieee80211_vif *vif)
2338
{
2339
TODO();
2340
}
2341
2342
static __inline uint32_t
2343
ieee80211_calc_rx_airtime(struct ieee80211_hw *hw,
2344
struct ieee80211_rx_status *rxstat, int len)
2345
{
2346
TODO();
2347
return (0);
2348
}
2349
2350
static __inline void
2351
ieee80211_get_tx_rates(struct ieee80211_vif *vif, struct ieee80211_sta *sta,
2352
struct sk_buff *skb, struct ieee80211_tx_rate *txrate, int nrates)
2353
{
2354
TODO();
2355
}
2356
2357
static __inline void
2358
ieee80211_color_change_finish(struct ieee80211_vif *vif, uint8_t link_id)
2359
{
2360
TODO();
2361
}
2362
2363
static __inline struct sk_buff *
2364
ieee80211_get_fils_discovery_tmpl(struct ieee80211_hw *hw,
2365
struct ieee80211_vif *vif)
2366
{
2367
TODO();
2368
return (NULL);
2369
}
2370
2371
static __inline struct sk_buff *
2372
ieee80211_get_unsol_bcast_probe_resp_tmpl(struct ieee80211_hw *hw,
2373
struct ieee80211_vif *vif)
2374
{
2375
TODO();
2376
return (NULL);
2377
}
2378
2379
static __inline void
2380
linuxkpi_ieee80211_send_bar(struct ieee80211_vif *vif, uint8_t *ra, uint16_t tid,
2381
uint16_t ssn)
2382
{
2383
TODO();
2384
}
2385
2386
static __inline void
2387
ieee80211_resume_disconnect(struct ieee80211_vif *vif)
2388
{
2389
TODO();
2390
}
2391
2392
static __inline int
2393
ieee80211_data_to_8023(struct sk_buff *skb, const uint8_t *addr,
2394
enum nl80211_iftype iftype)
2395
{
2396
TODO();
2397
return (-1);
2398
}
2399
2400
/* -------------------------------------------------------------------------- */
2401
2402
static __inline void
2403
ieee80211_key_mic_failure(struct ieee80211_key_conf *key)
2404
{
2405
TODO();
2406
}
2407
2408
static __inline void
2409
ieee80211_key_replay(struct ieee80211_key_conf *key)
2410
{
2411
TODO();
2412
}
2413
2414
static __inline void
2415
ieee80211_remove_key(struct ieee80211_key_conf *key)
2416
{
2417
TODO();
2418
}
2419
2420
static __inline struct ieee80211_key_conf *
2421
ieee80211_gtk_rekey_add(struct ieee80211_vif *vif,
2422
uint16_t keyidx, uint8_t *key, size_t keylen, int link_id)
2423
{
2424
TODO();
2425
return (NULL);
2426
}
2427
2428
static __inline void
2429
ieee80211_gtk_rekey_notify(struct ieee80211_vif *vif, const uint8_t *bssid,
2430
const uint8_t *replay_ctr, gfp_t gfp)
2431
{
2432
TODO();
2433
}
2434
2435
static __inline void
2436
ieee80211_tkip_add_iv(u8 *crypto_hdr, struct ieee80211_key_conf *keyconf,
2437
uint64_t pn)
2438
{
2439
TODO();
2440
}
2441
2442
static __inline void
2443
ieee80211_get_tkip_rx_p1k(struct ieee80211_key_conf *keyconf,
2444
const u8 *addr, uint32_t iv32, u16 *p1k)
2445
{
2446
2447
KASSERT(keyconf != NULL && addr != NULL && p1k != NULL,
2448
("%s: keyconf %p addr %p p1k %p\n", __func__, keyconf, addr, p1k));
2449
2450
TODO();
2451
memset(p1k, 0xfa, 5 * sizeof(*p1k)); /* Just initializing. */
2452
}
2453
2454
static __inline void
2455
ieee80211_get_tkip_p1k_iv(struct ieee80211_key_conf *key,
2456
uint32_t iv32, uint16_t *p1k)
2457
{
2458
TODO();
2459
}
2460
2461
static __inline void
2462
ieee80211_get_tkip_p2k(struct ieee80211_key_conf *keyconf,
2463
struct sk_buff *skb_frag, u8 *key)
2464
{
2465
TODO();
2466
}
2467
2468
static inline void
2469
ieee80211_get_key_rx_seq(struct ieee80211_key_conf *keyconf, int8_t tid,
2470
struct ieee80211_key_seq *seq)
2471
{
2472
const struct ieee80211_key *k;
2473
const uint8_t *p;
2474
2475
KASSERT(keyconf != NULL && seq != NULL, ("%s: keyconf %p seq %p\n",
2476
__func__, keyconf, seq));
2477
k = keyconf->_k;
2478
KASSERT(k != NULL, ("%s: keyconf %p ieee80211_key is NULL\n", __func__, keyconf));
2479
2480
switch (keyconf->cipher) {
2481
case WLAN_CIPHER_SUITE_TKIP:
2482
if (tid < 0 || tid >= IEEE80211_NUM_TIDS)
2483
return;
2484
/* See net80211::tkip_decrypt() */
2485
seq->tkip.iv32 = TKIP_PN_TO_IV32(k->wk_keyrsc[tid]);
2486
seq->tkip.iv16 = TKIP_PN_TO_IV16(k->wk_keyrsc[tid]);
2487
break;
2488
case WLAN_CIPHER_SUITE_CCMP:
2489
case WLAN_CIPHER_SUITE_CCMP_256:
2490
if (tid < -1 || tid >= IEEE80211_NUM_TIDS)
2491
return;
2492
if (tid == -1)
2493
p = (const uint8_t *)&k->wk_keyrsc[IEEE80211_NUM_TIDS]; /* IEEE80211_NONQOS_TID */
2494
else
2495
p = (const uint8_t *)&k->wk_keyrsc[tid];
2496
memcpy(seq->ccmp.pn, p, sizeof(seq->ccmp.pn));
2497
break;
2498
case WLAN_CIPHER_SUITE_GCMP:
2499
case WLAN_CIPHER_SUITE_GCMP_256:
2500
if (tid < -1 || tid >= IEEE80211_NUM_TIDS)
2501
return;
2502
if (tid == -1)
2503
p = (const uint8_t *)&k->wk_keyrsc[IEEE80211_NUM_TIDS]; /* IEEE80211_NONQOS_TID */
2504
else
2505
p = (const uint8_t *)&k->wk_keyrsc[tid];
2506
memcpy(seq->gcmp.pn, p, sizeof(seq->gcmp.pn));
2507
break;
2508
case WLAN_CIPHER_SUITE_AES_CMAC:
2509
case WLAN_CIPHER_SUITE_BIP_CMAC_256:
2510
TODO();
2511
memset(seq->aes_cmac.pn, 0xfa, sizeof(seq->aes_cmac.pn)); /* XXX TODO */
2512
break;
2513
case WLAN_CIPHER_SUITE_BIP_GMAC_128:
2514
case WLAN_CIPHER_SUITE_BIP_GMAC_256:
2515
TODO();
2516
memset(seq->aes_gmac.pn, 0xfa, sizeof(seq->aes_gmac.pn)); /* XXX TODO */
2517
break;
2518
default:
2519
pr_debug("%s: unsupported cipher suite %d\n", __func__, keyconf->cipher);
2520
break;
2521
}
2522
}
2523
2524
static __inline void
2525
ieee80211_set_key_rx_seq(struct ieee80211_key_conf *key, int tid,
2526
struct ieee80211_key_seq *seq)
2527
{
2528
TODO();
2529
}
2530
2531
/* -------------------------------------------------------------------------- */
2532
2533
static __inline void
2534
ieee80211_report_wowlan_wakeup(struct ieee80211_vif *vif,
2535
struct cfg80211_wowlan_wakeup *wakeup, gfp_t gfp)
2536
{
2537
TODO();
2538
}
2539
2540
static __inline void
2541
ieee80211_obss_color_collision_notify(struct ieee80211_vif *vif,
2542
uint64_t obss_color_bitmap, gfp_t gfp)
2543
{
2544
TODO();
2545
}
2546
2547
static __inline void
2548
ieee80211_refresh_tx_agg_session_timer(struct ieee80211_sta *sta,
2549
uint8_t tid)
2550
{
2551
TODO();
2552
}
2553
2554
static __inline struct ieee80211_ema_beacons *
2555
ieee80211_beacon_get_template_ema_list(struct ieee80211_hw *hw,
2556
struct ieee80211_vif *vif, uint32_t link_id)
2557
{
2558
TODO();
2559
return (NULL);
2560
}
2561
2562
static __inline void
2563
ieee80211_beacon_free_ema_list(struct ieee80211_ema_beacons *bcns)
2564
{
2565
TODO();
2566
}
2567
2568
static inline bool
2569
ieee80211_vif_is_mld(const struct ieee80211_vif *vif)
2570
{
2571
2572
/* If valid_links is non-zero, the vif is an MLD. */
2573
return (vif->valid_links != 0);
2574
}
2575
2576
static inline const struct ieee80211_sta_he_cap *
2577
ieee80211_get_he_iftype_cap_vif(const struct ieee80211_supported_band *band,
2578
struct ieee80211_vif *vif)
2579
{
2580
enum nl80211_iftype iftype;
2581
2582
iftype = ieee80211_vif_type_p2p(vif);
2583
return (ieee80211_get_he_iftype_cap(band, iftype));
2584
}
2585
2586
static inline const struct ieee80211_sta_eht_cap *
2587
ieee80211_get_eht_iftype_cap_vif(const struct ieee80211_supported_band *band,
2588
struct ieee80211_vif *vif)
2589
{
2590
enum nl80211_iftype iftype;
2591
2592
iftype = ieee80211_vif_type_p2p(vif);
2593
return (ieee80211_get_eht_iftype_cap(band, iftype));
2594
}
2595
2596
static inline uint32_t
2597
ieee80211_vif_usable_links(const struct ieee80211_vif *vif)
2598
{
2599
IMPROVE("MLO usable links likely are not just valid");
2600
return (vif->valid_links);
2601
}
2602
2603
static inline bool
2604
ieee80211_vif_link_active(const struct ieee80211_vif *vif, uint8_t link_id)
2605
{
2606
if (ieee80211_vif_is_mld(vif))
2607
return (vif->active_links & BIT(link_id));
2608
return (link_id == 0);
2609
}
2610
2611
static inline void
2612
ieee80211_set_active_links_async(struct ieee80211_vif *vif,
2613
uint32_t new_active_links)
2614
{
2615
TODO();
2616
}
2617
2618
static inline int
2619
ieee80211_set_active_links(struct ieee80211_vif *vif,
2620
uint32_t active_links)
2621
{
2622
TODO();
2623
return (-ENXIO);
2624
}
2625
2626
static inline void
2627
ieee80211_cqm_beacon_loss_notify(struct ieee80211_vif *vif, gfp_t gfp __unused)
2628
{
2629
IMPROVE("we notify user space by a vap state change eventually");
2630
linuxkpi_ieee80211_beacon_loss(vif);
2631
}
2632
2633
#define ieee80211_send_bar(_v, _r, _t, _s) \
2634
linuxkpi_ieee80211_send_bar(_v, _r, _t, _s)
2635
2636
/* -------------------------------------------------------------------------- */
2637
2638
int lkpi_80211_update_chandef(struct ieee80211_hw *,
2639
struct ieee80211_chanctx_conf *);
2640
2641
static inline int
2642
ieee80211_emulate_add_chanctx(struct ieee80211_hw *hw,
2643
struct ieee80211_chanctx_conf *chanctx_conf)
2644
{
2645
int error;
2646
2647
hw->conf.radar_enabled = chanctx_conf->radar_enabled;
2648
error = lkpi_80211_update_chandef(hw, chanctx_conf);
2649
return (error);
2650
}
2651
2652
static inline void
2653
ieee80211_emulate_remove_chanctx(struct ieee80211_hw *hw,
2654
struct ieee80211_chanctx_conf *chanctx_conf __unused)
2655
{
2656
hw->conf.radar_enabled = false;
2657
lkpi_80211_update_chandef(hw, NULL);
2658
}
2659
2660
static inline void
2661
ieee80211_emulate_change_chanctx(struct ieee80211_hw *hw,
2662
struct ieee80211_chanctx_conf *chanctx_conf, uint32_t changed __unused)
2663
{
2664
hw->conf.radar_enabled = chanctx_conf->radar_enabled;
2665
lkpi_80211_update_chandef(hw, chanctx_conf);
2666
}
2667
2668
static inline int
2669
ieee80211_emulate_switch_vif_chanctx(struct ieee80211_hw *hw,
2670
struct ieee80211_vif_chanctx_switch *vifs, int n_vifs,
2671
enum ieee80211_chanctx_switch_mode mode __unused)
2672
{
2673
struct ieee80211_chanctx_conf *chanctx_conf;
2674
int error;
2675
2676
/* Sanity check. */
2677
if (n_vifs <= 0)
2678
return (-EINVAL);
2679
if (vifs == NULL || vifs[0].new_ctx == NULL)
2680
return (-EINVAL);
2681
2682
/*
2683
* What to do if n_vifs > 1?
2684
* Does that make sense for drivers not supporting chanctx?
2685
*/
2686
hw->conf.radar_enabled = vifs[0].new_ctx->radar_enabled;
2687
chanctx_conf = vifs[0].new_ctx;
2688
error = lkpi_80211_update_chandef(hw, chanctx_conf);
2689
return (error);
2690
}
2691
2692
/* -------------------------------------------------------------------------- */
2693
2694
#endif /* _LINUXKPI_NET_MAC80211_H */
2695
2696