1 /*
2  * Driver interface definition
3  * Copyright (c) 2003-2017, Jouni Malinen <j@w1.fi>
4  *
5  * This software may be distributed under the terms of the BSD license.
6  * See README for more details.
7  *
8  * This file defines a driver interface used by both %wpa_supplicant and
9  * hostapd. The first part of the file defines data structures used in various
10  * driver operations. This is followed by the struct wpa_driver_ops that each
11  * driver wrapper will beed to define with callback functions for requesting
12  * driver operations. After this, there are definitions for driver event
13  * reporting with wpa_supplicant_event() and some convenience helper functions
14  * that can be used to report events.
15  */
16 
17 #ifndef DRIVER_H
18 #define DRIVER_H
19 
20 #define WPA_SUPPLICANT_DRIVER_VERSION 4
21 
22 #include "common/defs.h"
23 #include "common/ieee802_11_defs.h"
24 #include "common/wpa_common.h"
25 #ifdef CONFIG_MACSEC
26 #include "pae/ieee802_1x_kay.h"
27 #endif /* CONFIG_MACSEC */
28 #include "utils/list.h"
29 
30 #define HOSTAPD_CHAN_DISABLED 0x00000001
31 #define HOSTAPD_CHAN_NO_IR 0x00000002
32 #define HOSTAPD_CHAN_RADAR 0x00000008
33 #define HOSTAPD_CHAN_HT40PLUS 0x00000010
34 #define HOSTAPD_CHAN_HT40MINUS 0x00000020
35 #define HOSTAPD_CHAN_HT40 0x00000040
36 #define HOSTAPD_CHAN_SURVEY_LIST_INITIALIZED 0x00000080
37 
38 #define HOSTAPD_CHAN_DFS_UNKNOWN 0x00000000
39 #define HOSTAPD_CHAN_DFS_USABLE 0x00000100
40 #define HOSTAPD_CHAN_DFS_UNAVAILABLE 0x00000200
41 #define HOSTAPD_CHAN_DFS_AVAILABLE 0x00000300
42 #define HOSTAPD_CHAN_DFS_MASK 0x00000300
43 
44 #define HOSTAPD_CHAN_VHT_80MHZ_SUBCHANNEL 0x00000800
45 #define HOSTAPD_CHAN_VHT_160MHZ_SUBCHANNEL 0x00001000
46 #define HOSTAPD_CHAN_EHT_320MHZ_SUBCHANNEL 0x00002000
47 
48 #define HOSTAPD_CHAN_INDOOR_ONLY 0x00010000
49 #define HOSTAPD_CHAN_GO_CONCURRENT 0x00020000
50 
51 /* Allowed bandwidth mask */
52 enum hostapd_chan_width_attr {
53           HOSTAPD_CHAN_WIDTH_10   = BIT(0),
54           HOSTAPD_CHAN_WIDTH_20   = BIT(1),
55           HOSTAPD_CHAN_WIDTH_40P  = BIT(2),
56           HOSTAPD_CHAN_WIDTH_40M  = BIT(3),
57           HOSTAPD_CHAN_WIDTH_80   = BIT(4),
58           HOSTAPD_CHAN_WIDTH_160  = BIT(5),
59           HOSTAPD_CHAN_WIDTH_320  = BIT(6),
60 };
61 
62 /* Filter gratuitous ARP */
63 #define WPA_DATA_FRAME_FILTER_FLAG_ARP BIT(0)
64 /* Filter unsolicited Neighbor Advertisement */
65 #define WPA_DATA_FRAME_FILTER_FLAG_NA BIT(1)
66 /* Filter unicast IP packets encrypted using the GTK */
67 #define WPA_DATA_FRAME_FILTER_FLAG_GTK BIT(2)
68 
69 #define HOSTAPD_DFS_REGION_FCC          1
70 #define HOSTAPD_DFS_REGION_ETSI         2
71 #define HOSTAPD_DFS_REGION_JP 3
72 
73 /**
74  * enum reg_change_initiator - Regulatory change initiator
75  */
76 enum reg_change_initiator {
77           REGDOM_SET_BY_CORE,
78           REGDOM_SET_BY_USER,
79           REGDOM_SET_BY_DRIVER,
80           REGDOM_SET_BY_COUNTRY_IE,
81           REGDOM_BEACON_HINT,
82 };
83 
84 /**
85  * enum reg_type - Regulatory change types
86  */
87 enum reg_type {
88           REGDOM_TYPE_UNKNOWN,
89           REGDOM_TYPE_COUNTRY,
90           REGDOM_TYPE_WORLD,
91           REGDOM_TYPE_CUSTOM_WORLD,
92           REGDOM_TYPE_INTERSECTION,
93 };
94 
95 /**
96  * struct hostapd_wmm_rule - WMM regulatory rule
97  * @min_cwmin: Lower bound of CW_min value
98  * @min_cwmax: Lower bound of CW_max value
99  * @min_aifs: Lower bound of AIFS value
100  * @max_txop: Upper bound of TXOP, value in units of 32 usec
101  */
102 struct hostapd_wmm_rule {
103           int min_cwmin;
104           int min_cwmax;
105           int min_aifs;
106           int max_txop;
107 };
108 
109 /**
110  * struct hostapd_channel_data - Channel information
111  */
112 struct hostapd_channel_data {
113           /**
114            * chan - Channel number (IEEE 802.11)
115            */
116           short chan;
117 
118           /**
119            * freq - Frequency in MHz
120            */
121           int freq;
122 
123           /**
124            * flag - Channel flags (HOSTAPD_CHAN_*)
125            */
126           int flag;
127 
128           /**
129            * allowed_bw - Allowed channel width bitmask
130            *
131            * See enum hostapd_chan_width_attr.
132            */
133           u32 allowed_bw;
134 
135           /**
136            * max_tx_power - Regulatory transmit power limit in dBm
137            */
138           u8 max_tx_power;
139 
140           /**
141            * survey_list - Linked list of surveys (struct freq_survey)
142            */
143           struct dl_list survey_list;
144 
145           /**
146            * min_nf - Minimum observed noise floor, in dBm, based on all
147            * surveyed channel data
148            */
149           s8 min_nf;
150 
151 #ifdef CONFIG_ACS
152           /**
153            * interference_factor - Computed interference factor on this
154            * channel (used internally in src/ap/acs.c; driver wrappers do not
155            * need to set this)
156            */
157           long double interference_factor;
158 #endif /* CONFIG_ACS */
159 
160           /**
161            * dfs_cac_ms - DFS CAC time in milliseconds
162            */
163           unsigned int dfs_cac_ms;
164 
165           /**
166            * wmm_rules_valid - Indicates wmm_rules state
167            */
168           int wmm_rules_valid;
169 
170           /**
171            * wmm_rules - WMM regulatory rules
172            */
173           struct hostapd_wmm_rule wmm_rules[WMM_AC_NUM];
174 
175           /**
176            * punct_bitmap - RU puncturing bitmap
177            */
178           u16 punct_bitmap;
179 };
180 
181 #define HE_MAC_CAPAB_0                  0
182 #define HE_MAX_MAC_CAPAB_SIZE 6
183 #define HE_MAX_PHY_CAPAB_SIZE 11
184 #define HE_MAX_MCS_CAPAB_SIZE 12
185 #define HE_MAX_PPET_CAPAB_SIZE          25
186 
187 /**
188  * struct he_capabilities - IEEE 802.11ax HE capabilities
189  */
190 struct he_capabilities {
191           u8 he_supported;
192           u8 phy_cap[HE_MAX_PHY_CAPAB_SIZE];
193           u8 mac_cap[HE_MAX_MAC_CAPAB_SIZE];
194           u8 mcs[HE_MAX_MCS_CAPAB_SIZE];
195           u8 ppet[HE_MAX_PPET_CAPAB_SIZE];
196           u16 he_6ghz_capa;
197 };
198 
199 /* struct eht_capabilities - IEEE 802.11be EHT capabilities */
200 struct eht_capabilities {
201           bool eht_supported;
202           u16 mac_cap;
203           u8 phy_cap[EHT_PHY_CAPAB_LEN];
204           u8 mcs[EHT_MCS_NSS_CAPAB_LEN];
205           u8 ppet[EHT_PPE_THRESH_CAPAB_LEN];
206 };
207 
208 #define HOSTAPD_MODE_FLAG_HT_INFO_KNOWN BIT(0)
209 #define HOSTAPD_MODE_FLAG_VHT_INFO_KNOWN BIT(1)
210 #define HOSTAPD_MODE_FLAG_HE_INFO_KNOWN BIT(2)
211 
212 
213 enum ieee80211_op_mode {
214           IEEE80211_MODE_INFRA = 0,
215           IEEE80211_MODE_IBSS = 1,
216           IEEE80211_MODE_AP = 2,
217           IEEE80211_MODE_MESH = 5,
218 
219           /* only add new entries before IEEE80211_MODE_NUM */
220           IEEE80211_MODE_NUM
221 };
222 
223 /**
224  * struct ieee80211_edmg_config - EDMG configuration
225  *
226  * This structure describes most essential parameters needed
227  * for IEEE 802.11ay EDMG configuration
228  *
229  * @channels: Bitmap that indicates the 2.16 GHz channel(s)
230  *        that are allowed to be used for transmissions.
231  *        Bit 0 indicates channel 1, bit 1 indicates channel 2, etc.
232  *        Set to 0 to indicate EDMG not supported.
233  * @bw_config: Channel BW Configuration subfield encodes
234  *        the allowed channel bandwidth configurations
235  */
236 struct ieee80211_edmg_config {
237           u8 channels;
238           enum edmg_bw_config bw_config;
239 };
240 
241 /**
242  * struct hostapd_hw_modes - Supported hardware mode information
243  */
244 struct hostapd_hw_modes {
245           /**
246            * mode - Hardware mode
247            */
248           enum hostapd_hw_mode mode;
249 
250           /**
251            * is_6ghz - Whether the mode information is for the 6 GHz band
252            */
253           bool is_6ghz;
254 
255           /**
256            * num_channels - Number of entries in the channels array
257            */
258           int num_channels;
259 
260           /**
261            * channels - Array of supported channels
262            */
263           struct hostapd_channel_data *channels;
264 
265           /**
266            * num_rates - Number of entries in the rates array
267            */
268           int num_rates;
269 
270           /**
271            * rates - Array of supported rates in 100 kbps units
272            */
273           int *rates;
274 
275           /**
276            * ht_capab - HT (IEEE 802.11n) capabilities
277            */
278           u16 ht_capab;
279 
280           /**
281            * mcs_set - MCS (IEEE 802.11n) rate parameters
282            */
283           u8 mcs_set[16];
284 
285           /**
286            * a_mpdu_params - A-MPDU (IEEE 802.11n) parameters
287            */
288           u8 a_mpdu_params;
289 
290           /**
291            * vht_capab - VHT (IEEE 802.11ac) capabilities
292            */
293           u32 vht_capab;
294 
295           /**
296            * vht_mcs_set - VHT MCS (IEEE 802.11ac) rate parameters
297            */
298           u8 vht_mcs_set[8];
299 
300           unsigned int flags; /* HOSTAPD_MODE_FLAG_* */
301 
302           /**
303            * he_capab - HE (IEEE 802.11ax) capabilities
304            */
305           struct he_capabilities he_capab[IEEE80211_MODE_NUM];
306 
307           /**
308            * This structure describes the most essential parameters needed
309            * for IEEE 802.11ay EDMG configuration.
310            */
311           struct ieee80211_edmg_config edmg;
312 
313           /**
314            * eht_capab - EHT (IEEE 802.11be) capabilities
315            */
316           struct eht_capabilities eht_capab[IEEE80211_MODE_NUM];
317 };
318 
319 
320 #define IEEE80211_CAP_ESS     0x0001
321 #define IEEE80211_CAP_IBSS    0x0002
322 #define IEEE80211_CAP_PRIVACY 0x0010
323 #define IEEE80211_CAP_RRM     0x1000
324 
325 /* DMG (60 GHz) IEEE 802.11ad */
326 /* type - bits 0..1 */
327 #define IEEE80211_CAP_DMG_MASK          0x0003
328 #define IEEE80211_CAP_DMG_IBSS          0x0001 /* Tx by: STA */
329 #define IEEE80211_CAP_DMG_PBSS          0x0002 /* Tx by: PCP */
330 #define IEEE80211_CAP_DMG_AP  0x0003 /* Tx by: AP */
331 
332 #define WPA_SCAN_QUAL_INVALID           BIT(0)
333 #define WPA_SCAN_NOISE_INVALID                    BIT(1)
334 #define WPA_SCAN_LEVEL_INVALID                    BIT(2)
335 #define WPA_SCAN_LEVEL_DBM              BIT(3)
336 #define WPA_SCAN_ASSOCIATED             BIT(5)
337 
338 /**
339  * struct wpa_scan_res - Scan result for an BSS/IBSS
340  * @flags: information flags about the BSS/IBSS (WPA_SCAN_*)
341  * @bssid: BSSID
342  * @freq: frequency of the channel in MHz (e.g., 2412 = channel 1)
343  * @max_cw: the max channel width of the connection (calculated during scan
344  * result processing)
345  * @beacon_int: beacon interval in TUs (host byte order)
346  * @caps: capability information field in host byte order
347  * @qual: signal quality
348  * @noise: noise level
349  * @level: signal level
350  * @tsf: Timestamp
351  * @age: Age of the information in milliseconds (i.e., how many milliseconds
352  * ago the last Beacon or Probe Response frame was received)
353  * @est_throughput: Estimated throughput in kbps (this is calculated during
354  * scan result processing if left zero by the driver wrapper)
355  * @snr: Signal-to-noise ratio in dB (calculated during scan result processing)
356  * @parent_tsf: Time when the Beacon/Probe Response frame was received in terms
357  * of TSF of the BSS specified by %tsf_bssid.
358  * @tsf_bssid: The BSS that %parent_tsf TSF time refers to.
359  * @beacon_newer: Whether the Beacon frame data is known to be newer
360  * @ie_len: length of the following IE field in octets
361  * @beacon_ie_len: length of the following Beacon IE field in octets
362  *
363  * This structure is used as a generic format for scan results from the
364  * driver. Each driver interface implementation is responsible for converting
365  * the driver or OS specific scan results into this format.
366  *
367  * If the driver does not support reporting all IEs, the IE data structure is
368  * constructed of the IEs that are available. This field will also need to
369  * include SSID in IE format. All drivers are encouraged to be extended to
370  * report all IEs to make it easier to support future additions.
371  *
372  * This structure data is followed by ie_len octets of IEs from Probe Response
373  * frame (or if the driver does not indicate source of IEs, these may also be
374  * from Beacon frame). After the first set of IEs, another set of IEs may follow
375  * (with beacon_ie_len octets of data) if the driver provides both IE sets.
376  */
377 struct wpa_scan_res {
378           unsigned int flags;
379           u8 bssid[ETH_ALEN];
380           int freq;
381           enum chan_width max_cw;
382           u16 beacon_int;
383           u16 caps;
384           int qual;
385           int noise;
386           int level;
387           u64 tsf;
388           unsigned int age;
389           unsigned int est_throughput;
390           int snr;
391           u64 parent_tsf;
392           u8 tsf_bssid[ETH_ALEN];
393           bool beacon_newer;
394           size_t ie_len;
395           size_t beacon_ie_len;
396           /* Followed by ie_len + beacon_ie_len octets of IE data */
397 };
398 
399 /**
400  * struct wpa_scan_results - Scan results
401  * @res: Array of pointers to allocated variable length scan result entries
402  * @num: Number of entries in the scan result array
403  * @fetch_time: Time when the results were fetched from the driver
404  */
405 struct wpa_scan_results {
406           struct wpa_scan_res **res;
407           size_t num;
408           struct os_reltime fetch_time;
409 };
410 
411 /**
412  * struct wpa_interface_info - Network interface information
413  * @next: Pointer to the next interface or NULL if this is the last one
414  * @ifname: Interface name that can be used with init() or init2()
415  * @desc: Human readable adapter description (e.g., vendor/model) or NULL if
416  *        not available
417  * @drv_name: struct wpa_driver_ops::name (note: unlike other strings, this one
418  *        is not an allocated copy, i.e., get_interfaces() caller will not free
419  *        this)
420  */
421 struct wpa_interface_info {
422           struct wpa_interface_info *next;
423           char *ifname;
424           char *desc;
425           const char *drv_name;
426 };
427 
428 #define WPAS_MAX_SCAN_SSIDS 16
429 
430 /**
431  * struct wpa_driver_scan_ssid - SSIDs to scan for
432  * @ssid - specific SSID to scan for (ProbeReq)
433  *        %NULL or zero-length SSID is used to indicate active scan
434  *        with wildcard SSID.
435  * @ssid_len - Length of the SSID in octets
436  */
437 struct wpa_driver_scan_ssid {
438           const u8 *ssid;
439           size_t ssid_len;
440 };
441 
442 struct t2lm_mapping {
443           /**
444            * downlink - Bitmap of TIDs mapped with a link in downlink direction
445            */
446           u8 downlink;
447 
448           /**
449            * uplink - Bitmap of TIDs mapped with a link in uplink direction
450            */
451           u8 uplink;
452 };
453 
454 /**
455  * struct wpa_driver_scan_params - Scan parameters
456  * Data for struct wpa_driver_ops::scan2().
457  */
458 struct wpa_driver_scan_params {
459           /**
460            * ssids - SSIDs to scan for
461            */
462           struct wpa_driver_scan_ssid ssids[WPAS_MAX_SCAN_SSIDS];
463 
464           /**
465            * num_ssids - Number of entries in ssids array
466            * Zero indicates a request for a passive scan.
467            */
468           size_t num_ssids;
469 
470           /**
471            * extra_ies - Extra IE(s) to add into Probe Request or %NULL
472            */
473           const u8 *extra_ies;
474 
475           /**
476            * extra_ies_len - Length of extra_ies in octets
477            */
478           size_t extra_ies_len;
479 
480           /**
481            * freqs - Array of frequencies to scan or %NULL for all frequencies
482            *
483            * The frequency is set in MHz. The array is zero-terminated.
484            */
485           int *freqs;
486 
487           /**
488            * filter_ssids - Filter for reporting SSIDs
489            *
490            * This optional parameter can be used to request the driver wrapper to
491            * filter scan results to include only the specified SSIDs. %NULL
492            * indicates that no filtering is to be done. This can be used to
493            * reduce memory needs for scan results in environments that have large
494            * number of APs with different SSIDs.
495            *
496            * The driver wrapper is allowed to take this allocated buffer into its
497            * own use by setting the pointer to %NULL. In that case, the driver
498            * wrapper is responsible for freeing the buffer with os_free() once it
499            * is not needed anymore.
500            */
501           struct wpa_driver_scan_filter {
502                     u8 ssid[SSID_MAX_LEN];
503                     size_t ssid_len;
504           } *filter_ssids;
505 
506           /**
507            * num_filter_ssids - Number of entries in filter_ssids array
508            */
509           size_t num_filter_ssids;
510 
511           /**
512            * filter_rssi - Filter by RSSI
513            *
514            * The driver may filter scan results in firmware to reduce host
515            * wakeups and thereby save power. Specify the RSSI threshold in s32
516            * dBm.
517            */
518           s32 filter_rssi;
519 
520           /**
521            * p2p_probe - Used to disable CCK (802.11b) rates for P2P probes
522            *
523            * When set, the driver is expected to remove rates 1, 2, 5.5, and 11
524            * Mbps from the support rates element(s) in the Probe Request frames
525            * and not to transmit the frames at any of those rates.
526            */
527           unsigned int p2p_probe:1;
528 
529           /**
530            * only_new_results - Request driver to report only new results
531            *
532            * This is used to request the driver to report only BSSes that have
533            * been detected after this scan request has been started, i.e., to
534            * flush old cached BSS entries.
535            */
536           unsigned int only_new_results:1;
537 
538           /**
539            * low_priority - Requests driver to use a lower scan priority
540            *
541            * This is used to request the driver to use a lower scan priority
542            * if it supports such a thing.
543            */
544           unsigned int low_priority:1;
545 
546           /**
547            * mac_addr_rand - Requests driver to randomize MAC address
548            */
549           unsigned int mac_addr_rand:1;
550 
551           /**
552            * mac_addr - MAC address used with randomization. The address cannot be
553            * a multicast one, i.e., bit 0 of byte 0 should not be set.
554            */
555           u8 *mac_addr;
556 
557           /**
558            * mac_addr_mask - MAC address mask used with randomization.
559            *
560            * Bits that are 0 in the mask should be randomized. Bits that are 1 in
561            * the mask should be taken as is from mac_addr. The mask should not
562            * allow the generation of a multicast address, i.e., bit 0 of byte 0
563            * must be set.
564            */
565           const u8 *mac_addr_mask;
566 
567           /**
568            * sched_scan_plans - Scan plans for scheduled scan
569            *
570            * Each scan plan consists of the number of iterations to scan and the
571            * interval between scans. When a scan plan finishes (i.e., it was run
572            * for the specified number of iterations), the next scan plan is
573            * executed. The scan plans are executed in the order they appear in
574            * the array (lower index first). The last scan plan will run infinitely
575            * (until requested to stop), thus must not specify the number of
576            * iterations. All other scan plans must specify the number of
577            * iterations.
578            */
579           struct sched_scan_plan {
580                      u32 interval; /* In seconds */
581                      u32 iterations; /* Zero to run infinitely */
582            } *sched_scan_plans;
583 
584           /**
585            * sched_scan_plans_num - Number of scan plans in sched_scan_plans array
586            */
587            unsigned int sched_scan_plans_num;
588 
589           /**
590            * sched_scan_start_delay - Delay to use before starting the first scan
591            *
592            * Delay (in seconds) before scheduling first scan plan cycle. The
593            * driver may ignore this parameter and start immediately (or at any
594            * other time), if this feature is not supported.
595            */
596            u32 sched_scan_start_delay;
597 
598           /**
599            * bssid - Specific BSSID to scan for
600            *
601            * This optional parameter can be used to replace the default wildcard
602            * BSSID with a specific BSSID to scan for if results are needed from
603            * only a single BSS.
604            */
605           const u8 *bssid;
606 
607           /**
608            * scan_cookie - Unique identification representing the scan request
609            *
610            * This scan_cookie carries a unique identification representing the
611            * scan request if the host driver/kernel supports concurrent scan
612            * requests. This cookie is returned from the corresponding driver
613            * interface.
614            *
615            * Note: Unlike other parameters in this structure, scan_cookie is used
616            * only to return information instead of setting parameters for the
617            * scan.
618            */
619           u64 scan_cookie;
620 
621            /**
622             * duration - Dwell time on each channel
623             *
624             * This optional parameter can be used to set the dwell time on each
625             * channel. In TUs.
626             */
627            u16 duration;
628 
629            /**
630             * duration_mandatory - Whether the specified duration is mandatory
631             *
632             * If this is set, the duration specified by the %duration field is
633             * mandatory (and the driver should reject the scan request if it is
634             * unable to comply with the specified duration), otherwise it is the
635             * maximum duration and the actual duration may be shorter.
636             */
637            unsigned int duration_mandatory:1;
638 
639           /**
640            * relative_rssi_set - Whether relative RSSI parameters are set
641            */
642           unsigned int relative_rssi_set:1;
643 
644           /**
645            * relative_rssi - Relative RSSI for reporting better BSSs
646            *
647            * Amount of RSSI by which a BSS should be better than the current
648            * connected BSS to report the new BSS to user space.
649            */
650           s8 relative_rssi;
651 
652           /**
653            * relative_adjust_band - Band to which RSSI should be adjusted
654            *
655            * The relative_adjust_rssi should be added to the band specified
656            * by relative_adjust_band.
657            */
658           enum set_band relative_adjust_band;
659 
660           /**
661            * relative_adjust_rssi - RSSI to be added to relative_adjust_band
662            *
663            * An amount of relative_band_rssi should be added to the BSSs that
664            * belong to the band specified by relative_adjust_band while comparing
665            * with other bands for BSS reporting.
666            */
667           s8 relative_adjust_rssi;
668 
669           /**
670            * oce_scan
671            *
672            * Enable the following OCE scan features: (WFA OCE TechSpec v1.0)
673            * - Accept broadcast Probe Response frame.
674            * - Probe Request frame deferral and suppression.
675            * - Max Channel Time - driver fills FILS request params IE with
676            *   Maximum Channel Time.
677            * - Send 1st Probe Request frame in rate of minimum 5.5 Mbps.
678            */
679           unsigned int oce_scan:1;
680 
681           /**
682            * p2p_include_6ghz - Include 6 GHz channels for P2P full scan
683            *
684            */
685           unsigned int p2p_include_6ghz:1;
686 
687           /**
688            * non_coloc_6ghz - Force scanning of non-PSC 6 GHz channels
689            *
690            * If this is set, the driver should scan non-PSC channels from the
691            * scan request even if neighbor reports from 2.4/5 GHz APs did not
692            * report a co-located AP on these channels. The default is to scan
693            * non-PSC channels only if a co-located AP was reported on the channel.
694            */
695           unsigned int non_coloc_6ghz:1;
696 
697           /**
698            * min_probe_req_content - Minimize probe request content to only have
699            * minimal requirement elements, e.g., supported rates etc., and no
700            * additional elements other then those provided by user space.
701            */
702           unsigned int min_probe_req_content:1;
703 
704           /**
705            * link_id - Specify the link that is requesting the scan on an MLD
706            *
707            * This is set when operating as an AP MLD and doing an OBSS scan.
708            * -1 indicates that no particular link ID is set.
709            */
710           s8 link_id;
711 
712           /*
713            * NOTE: Whenever adding new parameters here, please make sure
714            * wpa_scan_clone_params() and wpa_scan_free_params() get updated with
715            * matching changes.
716            */
717 };
718 
719 /**
720  * struct wpa_driver_auth_params - Authentication parameters
721  * Data for struct wpa_driver_ops::authenticate().
722  */
723 struct wpa_driver_auth_params {
724           int freq;
725           const u8 *bssid;
726           const u8 *ssid;
727           size_t ssid_len;
728           int auth_alg;
729           const u8 *ie;
730           size_t ie_len;
731           const u8 *wep_key[4];
732           size_t wep_key_len[4];
733           int wep_tx_keyidx;
734           int local_state_change;
735 
736           /**
737            * p2p - Whether this connection is a P2P group
738            */
739           int p2p;
740 
741           /**
742            * auth_data - Additional elements for Authentication frame
743            *
744            * This buffer starts with the Authentication transaction sequence
745            * number field. If no special handling of such elements is needed, this
746            * pointer is %NULL. This is used with SAE and FILS.
747            */
748           const u8 *auth_data;
749 
750           /**
751            * auth_data_len - Length of auth_data buffer in octets
752            */
753           size_t auth_data_len;
754 
755           /**
756            * mld - Establish an MLD connection
757            */
758           bool mld;
759 
760           /**
761            * mld_link_id - The link ID of the MLD AP to which we are associating
762            */
763           u8 mld_link_id;
764 
765           /**
766            * The MLD AP address
767            */
768           const u8 *ap_mld_addr;
769 };
770 
771 /**
772  * enum wps_mode - WPS mode
773  */
774 enum wps_mode {
775           /**
776            * WPS_MODE_NONE - No WPS provisioning being used
777            */
778           WPS_MODE_NONE,
779 
780           /**
781            * WPS_MODE_OPEN - WPS provisioning with AP that is in open mode
782            */
783           WPS_MODE_OPEN,
784 
785           /**
786            * WPS_MODE_PRIVACY - WPS provisioning with AP that is using protection
787            */
788           WPS_MODE_PRIVACY
789 };
790 
791 /**
792  * struct hostapd_freq_params - Channel parameters
793  */
794 struct hostapd_freq_params {
795           /**
796            * mode - Mode/band (HOSTAPD_MODE_IEEE80211A, ..)
797            */
798           enum hostapd_hw_mode mode;
799 
800           /**
801            * freq - Primary channel center frequency in MHz
802            */
803           int freq;
804 
805           /**
806            * channel - Channel number
807            */
808           int channel;
809 
810           /**
811            * ht_enabled - Whether HT is enabled
812            */
813           int ht_enabled;
814 
815           /**
816            * sec_channel_offset - Secondary channel offset for HT40
817            *
818            * 0 = HT40 disabled,
819            * -1 = HT40 enabled, secondary channel below primary,
820            * 1 = HT40 enabled, secondary channel above primary
821            */
822           int sec_channel_offset;
823 
824           /**
825            * vht_enabled - Whether VHT is enabled
826            */
827           int vht_enabled;
828 
829           /**
830            * he_enabled - Whether HE is enabled
831            */
832           int he_enabled;
833 
834           /**
835            * center_freq1 - Segment 0 center frequency in MHz
836            *
837            * Valid for both HT and VHT.
838            */
839           int center_freq1;
840 
841           /**
842            * center_freq2 - Segment 1 center frequency in MHz
843            *
844            * Non-zero only for bandwidth 80 and an 80+80 channel
845            */
846           int center_freq2;
847 
848           /**
849            * bandwidth - Channel bandwidth in MHz (20, 40, 80, 160)
850            */
851           int bandwidth;
852 
853           /**
854            * This structure describes the most essential parameters needed
855            * for IEEE 802.11ay EDMG configuration.
856            */
857           struct ieee80211_edmg_config edmg;
858 
859           /**
860            * radar_background - Whether radar/CAC background is requested
861            */
862           bool radar_background;
863 
864           /**
865            * eht_enabled - Whether EHT is enabled
866            */
867           bool eht_enabled;
868 
869           /**
870            * link_id: If >=0 indicates the link of the AP MLD to configure
871            */
872           int link_id;
873 };
874 
875 /**
876  * struct wpa_driver_sta_auth_params - Authentication parameters
877  * Data for struct wpa_driver_ops::sta_auth().
878  */
879 struct wpa_driver_sta_auth_params {
880 
881           /**
882            * own_addr - Source address and BSSID for authentication frame
883            */
884           const u8 *own_addr;
885 
886           /**
887            * addr - MAC address of the station to associate
888            */
889           const u8 *addr;
890 
891           /**
892            * seq - authentication sequence number
893            */
894           u16 seq;
895 
896           /**
897            * status - authentication response status code
898            */
899           u16 status;
900 
901           /**
902            * ie - authentication frame ie buffer
903            */
904           const u8 *ie;
905 
906           /**
907            * len - ie buffer length
908            */
909           size_t len;
910 
911           /**
912            * fils_auth - Indicates whether FILS authentication is being performed
913            */
914           int fils_auth;
915 
916           /**
917            * fils_anonce - ANonce (required for FILS)
918            */
919           u8 fils_anonce[WPA_NONCE_LEN];
920 
921           /**
922            * fils_snonce - SNonce (required for FILS)
923           */
924           u8 fils_snonce[WPA_NONCE_LEN];
925 
926           /**
927            * fils_kek - key for encryption (required for FILS)
928            */
929           u8 fils_kek[WPA_KEK_MAX_LEN];
930 
931           /**
932            * fils_kek_len - Length of the fils_kek in octets (required for FILS)
933            */
934           size_t fils_kek_len;
935 };
936 
937 struct wpa_driver_mld_params {
938           /**
939            * mld_addr - AP's MLD address
940            */
941           const u8 *mld_addr;
942 
943           /**
944            * valid_links - The valid links including the association link
945            */
946           u16 valid_links;
947 
948           /**
949            * assoc_link_id - The link on which the association is performed
950            */
951           u8 assoc_link_id;
952 
953           /**
954            * mld_links - Link information
955            *
956            * Should include information on all the requested links for association
957            * including the link on which the association should take place.
958            * For the association link, the ies and ies_len should be NULL and
959            * 0 respectively.
960            */
961           struct {
962                     int freq;
963                     const u8 *bssid;
964                     const u8 *ies;
965                     size_t ies_len;
966                     int error;
967                     bool disabled;
968           } mld_links[MAX_NUM_MLD_LINKS];
969 };
970 
971 /**
972  * struct wpa_driver_associate_params - Association parameters
973  * Data for struct wpa_driver_ops::associate().
974  */
975 struct wpa_driver_associate_params {
976           /**
977            * bssid - BSSID of the selected AP
978            * This can be %NULL, if ap_scan=2 mode is used and the driver is
979            * responsible for selecting with which BSS to associate. */
980           const u8 *bssid;
981 
982           /**
983            * bssid_hint - BSSID of a proposed AP
984            *
985            * This indicates which BSS has been found a suitable candidate for
986            * initial association for drivers that use driver/firmwate-based BSS
987            * selection. Unlike the @bssid parameter, @bssid_hint does not limit
988            * the driver from selecting other BSSes in the ESS.
989            */
990           const u8 *bssid_hint;
991 
992           /**
993            * ssid - The selected SSID
994            */
995           const u8 *ssid;
996 
997           /**
998            * ssid_len - Length of the SSID (1..32)
999            */
1000           size_t ssid_len;
1001 
1002           /**
1003            * freq - channel parameters
1004            */
1005           struct hostapd_freq_params freq;
1006 
1007           /**
1008            * freq_hint - Frequency of the channel the proposed AP is using
1009            *
1010            * This provides a channel on which a suitable BSS has been found as a
1011            * hint for the driver. Unlike the @freq parameter, @freq_hint does not
1012            * limit the driver from selecting other channels for
1013            * driver/firmware-based BSS selection.
1014            */
1015           int freq_hint;
1016 
1017           /**
1018            * bg_scan_period - Background scan period in seconds, 0 to disable
1019            * background scan, or -1 to indicate no change to default driver
1020            * configuration
1021            */
1022           int bg_scan_period;
1023 
1024           /**
1025            * beacon_int - Beacon interval for IBSS or 0 to use driver default
1026            */
1027           int beacon_int;
1028 
1029           /**
1030            * wpa_ie - WPA information element for (Re)Association Request
1031            * WPA information element to be included in (Re)Association
1032            * Request (including information element id and length). Use
1033            * of this WPA IE is optional. If the driver generates the WPA
1034            * IE, it can use pairwise_suite, group_suite, group_mgmt_suite, and
1035            * key_mgmt_suite to select proper algorithms. In this case,
1036            * the driver has to notify wpa_supplicant about the used WPA
1037            * IE by generating an event that the interface code will
1038            * convert into EVENT_ASSOCINFO data (see below).
1039            *
1040            * When using WPA2/IEEE 802.11i, wpa_ie is used for RSN IE
1041            * instead. The driver can determine which version is used by
1042            * looking at the first byte of the IE (0xdd for WPA, 0x30 for
1043            * WPA2/RSN).
1044            *
1045            * When using WPS, wpa_ie is used for WPS IE instead of WPA/RSN IE.
1046            */
1047           const u8 *wpa_ie;
1048 
1049           /**
1050            * wpa_ie_len - length of the wpa_ie
1051            */
1052           size_t wpa_ie_len;
1053 
1054           /**
1055            * wpa_proto - Bitfield of WPA_PROTO_* values to indicate WPA/WPA2
1056            */
1057           unsigned int wpa_proto;
1058 
1059           /**
1060            * pairwise_suite - Selected pairwise cipher suite (WPA_CIPHER_*)
1061            *
1062            * This is usually ignored if @wpa_ie is used.
1063            */
1064           unsigned int pairwise_suite;
1065 
1066           /**
1067            * group_suite - Selected group cipher suite (WPA_CIPHER_*)
1068            *
1069            * This is usually ignored if @wpa_ie is used.
1070            */
1071           unsigned int group_suite;
1072 
1073           /**
1074            * mgmt_group_suite - Selected group management cipher suite (WPA_CIPHER_*)
1075            *
1076            * This is usually ignored if @wpa_ie is used.
1077            */
1078           unsigned int mgmt_group_suite;
1079 
1080           /**
1081            * key_mgmt_suite - Selected key management suite (WPA_KEY_MGMT_*)
1082            *
1083            * This is usually ignored if @wpa_ie is used.
1084            */
1085           unsigned int key_mgmt_suite;
1086 
1087           /**
1088            * allowed_key_mgmts - Bitfield of allowed key management suites
1089            * (WPA_KEY_MGMT_*) other than @key_mgmt_suite for the current
1090            * connection
1091            *
1092            * SME in the driver may choose key_mgmt from this list for the initial
1093            * connection or roaming. The driver which doesn't support this
1094            * ignores this parameter.
1095            */
1096           unsigned int allowed_key_mgmts;
1097 
1098           /**
1099            * auth_alg - Allowed authentication algorithms
1100            * Bit field of WPA_AUTH_ALG_*
1101            */
1102           int auth_alg;
1103 
1104           /**
1105            * mode - Operation mode (infra/ibss) IEEE80211_MODE_*
1106            */
1107           int mode;
1108 
1109           /**
1110            * wep_key - WEP keys for static WEP configuration
1111            */
1112           const u8 *wep_key[4];
1113 
1114           /**
1115            * wep_key_len - WEP key length for static WEP configuration
1116            */
1117           size_t wep_key_len[4];
1118 
1119           /**
1120            * wep_tx_keyidx - WEP TX key index for static WEP configuration
1121            */
1122           int wep_tx_keyidx;
1123 
1124           /**
1125            * mgmt_frame_protection - IEEE 802.11w management frame protection
1126            */
1127           enum mfp_options mgmt_frame_protection;
1128 
1129           /**
1130            * passphrase - RSN passphrase for PSK
1131            *
1132            * This value is made available only for WPA/WPA2-Personal (PSK) and
1133            * only for drivers that set WPA_DRIVER_FLAGS_4WAY_HANDSHAKE_PSK. This
1134            * is the 8..63 character ASCII passphrase, if available. Please note
1135            * that this can be %NULL if passphrase was not used to generate the
1136            * PSK. In that case, the psk field must be used to fetch the PSK.
1137            */
1138           const char *passphrase;
1139 
1140           /**
1141            * psk - RSN PSK (alternative for passphrase for PSK)
1142            *
1143            * This value is made available only for WPA/WPA2-Personal (PSK) and
1144            * only for drivers that set WPA_DRIVER_FLAGS_4WAY_HANDSHAKE_PSK. This
1145            * is the 32-octet (256-bit) PSK, if available. The driver wrapper
1146            * should be prepared to handle %NULL value as an error.
1147            */
1148           const u8 *psk;
1149 
1150           /**
1151            * sae_password - Password for SAE authentication
1152            *
1153            * This value is made available only for WPA3-Personal (SAE) and only
1154            * for drivers that set WPA_DRIVER_FLAGS2_SAE_OFFLOAD.
1155            */
1156           const char *sae_password;
1157 
1158           /**
1159            * sae_password_id - Password Identifier for SAE authentication
1160            *
1161            * This value is made available only for WPA3-Personal (SAE) and only
1162            * for drivers that set WPA_DRIVER_FLAGS2_SAE_OFFLOAD. If %NULL, SAE
1163            * password identifier is not used.
1164            */
1165           const char *sae_password_id;
1166 
1167           /**
1168            * drop_unencrypted - Enable/disable unencrypted frame filtering
1169            *
1170            * Configure the driver to drop all non-EAPOL frames (both receive and
1171            * transmit paths). Unencrypted EAPOL frames (ethertype 0x888e) must
1172            * still be allowed for key negotiation.
1173            */
1174           int drop_unencrypted;
1175 
1176           /**
1177            * prev_bssid - Previously used BSSID in this ESS
1178            *
1179            * When not %NULL, this is a request to use reassociation instead of
1180            * association.
1181            */
1182           const u8 *prev_bssid;
1183 
1184           /**
1185            * wps - WPS mode
1186            *
1187            * If the driver needs to do special configuration for WPS association,
1188            * this variable provides more information on what type of association
1189            * is being requested. Most drivers should not need to use this.
1190            */
1191           enum wps_mode wps;
1192 
1193           /**
1194            * p2p - Whether this connection is a P2P group
1195            */
1196           int p2p;
1197 
1198           /**
1199            * uapsd - UAPSD parameters for the network
1200            * -1 = do not change defaults
1201            * AP mode: 1 = enabled, 0 = disabled
1202            * STA mode: bits 0..3 UAPSD enabled for VO,VI,BK,BE
1203            */
1204           int uapsd;
1205 
1206           /**
1207            * fixed_bssid - Whether to force this BSSID in IBSS mode
1208            * 1 = Fix this BSSID and prevent merges.
1209            * 0 = Do not fix BSSID.
1210            */
1211           int fixed_bssid;
1212 
1213           /**
1214            * fixed_freq - Fix control channel in IBSS mode
1215            * 0 = don't fix control channel (default)
1216            * 1 = fix control channel; this prevents IBSS merging with another
1217            *        channel
1218            */
1219           int fixed_freq;
1220 
1221           /**
1222            * disable_ht - Disable HT (IEEE 802.11n) for this connection
1223            */
1224           int disable_ht;
1225 
1226           /**
1227            * htcaps - HT Capabilities over-rides
1228            *
1229            * Only bits set in the mask will be used, and not all values are used
1230            * by the kernel anyway. Currently, MCS, MPDU and MSDU fields are used.
1231            *
1232            * Pointer to struct ieee80211_ht_capabilities.
1233            */
1234           const u8 *htcaps;
1235 
1236           /**
1237            * htcaps_mask - HT Capabilities over-rides mask
1238            *
1239            * Pointer to struct ieee80211_ht_capabilities.
1240            */
1241           const u8 *htcaps_mask;
1242 
1243 #ifdef CONFIG_VHT_OVERRIDES
1244           /**
1245            * disable_vht - Disable VHT for this connection
1246            */
1247           int disable_vht;
1248 
1249           /**
1250            * VHT capability overrides.
1251            */
1252           const struct ieee80211_vht_capabilities *vhtcaps;
1253           const struct ieee80211_vht_capabilities *vhtcaps_mask;
1254 #endif /* CONFIG_VHT_OVERRIDES */
1255 
1256 #ifdef CONFIG_HE_OVERRIDES
1257           /**
1258            * disable_he - Disable HE for this connection
1259            */
1260           int disable_he;
1261 #endif /* CONFIG_HE_OVERRIDES */
1262 
1263           /**
1264            * req_key_mgmt_offload - Request key management offload for connection
1265            *
1266            * Request key management offload for this connection if the device
1267            * supports it.
1268            */
1269           int req_key_mgmt_offload;
1270 
1271           /**
1272            * req_handshake_offload - Request EAPOL handshake offload
1273            *
1274            * Request EAPOL handshake offload for this connection if the device
1275            * supports it.
1276            */
1277           int req_handshake_offload;
1278 
1279           /**
1280            * Flag for indicating whether this association includes support for
1281            * RRM (Radio Resource Measurements)
1282            */
1283           int rrm_used;
1284 
1285           /**
1286            * pbss - If set, connect to a PCP in a PBSS. Otherwise, connect to an
1287            * AP as usual. Valid for DMG network only.
1288            */
1289           int pbss;
1290 
1291           /**
1292            * fils_kek - KEK for FILS association frame protection (AES-SIV)
1293            */
1294           const u8 *fils_kek;
1295 
1296           /**
1297            * fils_kek_len: Length of fils_kek in bytes
1298            */
1299           size_t fils_kek_len;
1300 
1301           /**
1302            * fils_nonces - Nonces for FILS association frame protection
1303            * (AES-SIV AAD)
1304            */
1305           const u8 *fils_nonces;
1306 
1307           /**
1308            * fils_nonces_len: Length of fils_nonce in bytes
1309            */
1310           size_t fils_nonces_len;
1311 
1312           /**
1313            * fils_erp_username - Username part of keyName-NAI
1314            */
1315           const u8 *fils_erp_username;
1316 
1317           /**
1318            * fils_erp_username_len - Length of fils_erp_username in bytes
1319            */
1320           size_t fils_erp_username_len;
1321 
1322           /**
1323            * fils_erp_realm - Realm/domain name to use in FILS ERP
1324            */
1325           const u8 *fils_erp_realm;
1326 
1327           /**
1328            * fils_erp_realm_len - Length of fils_erp_realm in bytes
1329            */
1330           size_t fils_erp_realm_len;
1331 
1332           /**
1333            * fils_erp_next_seq_num - The next sequence number to use in FILS ERP
1334            * messages
1335            */
1336           u16 fils_erp_next_seq_num;
1337 
1338           /**
1339            * fils_erp_rrk - Re-authentication root key (rRK) for the keyName-NAI
1340            * specified by fils_erp_username@fils_erp_realm.
1341            */
1342           const u8 *fils_erp_rrk;
1343 
1344           /**
1345            * fils_erp_rrk_len - Length of fils_erp_rrk in bytes
1346            */
1347           size_t fils_erp_rrk_len;
1348 
1349           /**
1350            * sae_pwe - SAE mechanism for PWE derivation
1351            * 0 = hunting-and-pecking loop only
1352            * 1 = hash-to-element only
1353            * 2 = both hunting-and-pecking loop and hash-to-element enabled
1354            */
1355           enum sae_pwe sae_pwe;
1356 
1357           /**
1358            * disable_eht - Disable EHT for this connection
1359            */
1360           int disable_eht;
1361 
1362           /*
1363            * mld_params - MLD association parameters
1364            */
1365           struct wpa_driver_mld_params mld_params;
1366 };
1367 
1368 enum hide_ssid {
1369           NO_SSID_HIDING,
1370           HIDDEN_SSID_ZERO_LEN,
1371           HIDDEN_SSID_ZERO_CONTENTS
1372 };
1373 
1374 enum ch_switch_state {
1375           CH_SW_STARTED,
1376           CH_SW_FINISHED
1377 };
1378 
1379 struct wowlan_triggers {
1380           u8 any;
1381           u8 disconnect;
1382           u8 magic_pkt;
1383           u8 gtk_rekey_failure;
1384           u8 eap_identity_req;
1385           u8 four_way_handshake;
1386           u8 rfkill_release;
1387 };
1388 
1389 struct unsol_bcast_probe_resp {
1390           /**
1391            * Unsolicited broadcast Probe Response interval in TUs
1392            */
1393           unsigned int unsol_bcast_probe_resp_interval;
1394 
1395           /**
1396            * Unsolicited broadcast Probe Response template data
1397            */
1398           u8 *unsol_bcast_probe_resp_tmpl;
1399 
1400           /**
1401            * Unsolicited broadcast Probe Response template length
1402            */
1403           size_t unsol_bcast_probe_resp_tmpl_len;
1404 };
1405 
1406 struct wpa_driver_ap_params {
1407           /**
1408            * head - Beacon head from IEEE 802.11 header to IEs before TIM IE
1409            */
1410           u8 *head;
1411 
1412           /**
1413            * head_len - Length of the head buffer in octets
1414            */
1415           size_t head_len;
1416 
1417           /**
1418            * tail - Beacon tail following TIM IE
1419            */
1420           u8 *tail;
1421 
1422           /**
1423            * tail_len - Length of the tail buffer in octets
1424            */
1425           size_t tail_len;
1426 
1427           /**
1428            * dtim_period - DTIM period
1429            */
1430           int dtim_period;
1431 
1432           /**
1433            * beacon_int - Beacon interval
1434            */
1435           int beacon_int;
1436 
1437           /**
1438            * basic_rates: -1 terminated array of basic rates in 100 kbps
1439            *
1440            * This parameter can be used to set a specific basic rate set for the
1441            * BSS. If %NULL, default basic rate set is used.
1442            */
1443           int *basic_rates;
1444 
1445           /**
1446            * beacon_rate: Beacon frame data rate
1447            *
1448            * This parameter can be used to set a specific Beacon frame data rate
1449            * for the BSS. The interpretation of this value depends on the
1450            * rate_type (legacy: in 100 kbps units, HT: HT-MCS, VHT: VHT-MCS,
1451            * HE: HE-MCS). If beacon_rate == 0 and rate_type == 0
1452            * (BEACON_RATE_LEGACY), the default Beacon frame data rate is used.
1453            */
1454           unsigned int beacon_rate;
1455 
1456           /**
1457            * beacon_rate_type: Beacon data rate type (legacy/HT/VHT/HE)
1458            */
1459           enum beacon_rate_type rate_type;
1460 
1461           /**
1462            * proberesp - Probe Response template
1463            *
1464            * This is used by drivers that reply to Probe Requests internally in
1465            * AP mode and require the full Probe Response template.
1466            */
1467           u8 *proberesp;
1468 
1469           /**
1470            * proberesp_len - Length of the proberesp buffer in octets
1471            */
1472           size_t proberesp_len;
1473 
1474           /**
1475            * ssid - The SSID to use in Beacon/Probe Response frames
1476            */
1477           const u8 *ssid;
1478 
1479           /**
1480            * ssid_len - Length of the SSID (1..32)
1481            */
1482           size_t ssid_len;
1483 
1484           /**
1485            * hide_ssid - Whether to hide the SSID
1486            */
1487           enum hide_ssid hide_ssid;
1488 
1489           /**
1490            * pairwise_ciphers - WPA_CIPHER_* bitfield
1491            */
1492           unsigned int pairwise_ciphers;
1493 
1494           /**
1495            * group_cipher - WPA_CIPHER_*
1496            */
1497           unsigned int group_cipher;
1498 
1499           /**
1500            * key_mgmt_suites - WPA_KEY_MGMT_* bitfield
1501            */
1502           unsigned int key_mgmt_suites;
1503 
1504           /**
1505            * auth_algs - WPA_AUTH_ALG_* bitfield
1506            */
1507           unsigned int auth_algs;
1508 
1509           /**
1510            * wpa_version - WPA_PROTO_* bitfield
1511            */
1512           unsigned int wpa_version;
1513 
1514           /**
1515            * privacy - Whether privacy is used in the BSS
1516            */
1517           int privacy;
1518 
1519           /**
1520            * beacon_ies - WPS/P2P IE(s) for Beacon frames
1521            *
1522            * This is used to add IEs like WPS IE and P2P IE by drivers that do
1523            * not use the full Beacon template.
1524            */
1525           const struct wpabuf *beacon_ies;
1526 
1527           /**
1528            * proberesp_ies - P2P/WPS IE(s) for Probe Response frames
1529            *
1530            * This is used to add IEs like WPS IE and P2P IE by drivers that
1531            * reply to Probe Request frames internally.
1532            */
1533           const struct wpabuf *proberesp_ies;
1534 
1535           /**
1536            * assocresp_ies - WPS IE(s) for (Re)Association Response frames
1537            *
1538            * This is used to add IEs like WPS IE by drivers that reply to
1539            * (Re)Association Request frames internally.
1540            */
1541           const struct wpabuf *assocresp_ies;
1542 
1543           /**
1544            * isolate - Whether to isolate frames between associated stations
1545            *
1546            * If this is non-zero, the AP is requested to disable forwarding of
1547            * frames between associated stations.
1548            */
1549           int isolate;
1550 
1551           /**
1552            * cts_protect - Whether CTS protection is enabled
1553            */
1554           int cts_protect;
1555 
1556           /**
1557            * preamble - Whether short preamble is enabled
1558            */
1559           int preamble;
1560 
1561           /**
1562            * short_slot_time - Whether short slot time is enabled
1563            *
1564            * 0 = short slot time disable, 1 = short slot time enabled, -1 = do
1565            * not set (e.g., when 802.11g mode is not in use)
1566            */
1567           int short_slot_time;
1568 
1569           /**
1570            * ht_opmode - HT operation mode or -1 if HT not in use
1571            */
1572           int ht_opmode;
1573 
1574           /**
1575            * interworking - Whether Interworking is enabled
1576            */
1577           int interworking;
1578 
1579           /**
1580            * hessid - Homogeneous ESS identifier or %NULL if not set
1581            */
1582           const u8 *hessid;
1583 
1584           /**
1585            * access_network_type - Access Network Type (0..15)
1586            *
1587            * This is used for filtering Probe Request frames when Interworking is
1588            * enabled.
1589            */
1590           u8 access_network_type;
1591 
1592           /**
1593            * ap_max_inactivity - Timeout in seconds to detect STA's inactivity
1594            *
1595            * This is used by driver which advertises this capability.
1596            */
1597           int ap_max_inactivity;
1598 
1599           /**
1600            * ctwindow - Client Traffic Window (in TUs)
1601            */
1602           u8 p2p_go_ctwindow;
1603 
1604           /**
1605            * disable_dgaf - Whether group-addressed frames are disabled
1606            */
1607           int disable_dgaf;
1608 
1609           /**
1610            * osen - Whether OSEN security is enabled
1611            */
1612           int osen;
1613 
1614           /**
1615            * freq - Channel parameters for dynamic bandwidth changes
1616            */
1617           struct hostapd_freq_params *freq;
1618 
1619           /**
1620            * reenable - Whether this is to re-enable beaconing
1621            */
1622           int reenable;
1623 
1624           /**
1625            * pbss - Whether to start a PCP (in PBSS) instead of an AP in
1626            * infrastructure BSS. Valid only for DMG network.
1627            */
1628           int pbss;
1629 
1630           /**
1631            * multicast_to_unicast - Whether to use multicast_to_unicast
1632            *
1633            * If this is non-zero, the AP is requested to perform multicast to
1634            * unicast conversion for ARP, IPv4, and IPv6 frames (possibly within
1635            * 802.1Q). If enabled, such frames are to be sent to each station
1636            * separately, with the DA replaced by their own MAC address rather
1637            * than the group address.
1638            *
1639            * Note that this may break certain expectations of the receiver, such
1640            * as the ability to drop unicast IP packets received within multicast
1641            * L2 frames, or the ability to not send ICMP destination unreachable
1642            * messages for packets received in L2 multicast (which is required,
1643            * but the receiver can't tell the difference if this new option is
1644            * enabled.)
1645            *
1646            * This also doesn't implement the 802.11 DMS (directed multicast
1647            * service).
1648            */
1649           int multicast_to_unicast;
1650 
1651           /**
1652            * ftm_responder - Whether FTM responder is enabled
1653            */
1654           int ftm_responder;
1655 
1656           /**
1657            * lci - Binary data, the content of an LCI report IE with type 8 as
1658            * defined in IEEE Std 802.11-2016, 9.4.2.22.10
1659            */
1660           const struct wpabuf *lci;
1661 
1662           /**
1663            * civic - Binary data, the content of a measurement report IE with
1664            * type 11 as defined in IEEE Std 802.11-2016, 9.4.2.22.13
1665            */
1666           const struct wpabuf *civic;
1667 
1668           /**
1669            * he_spr_ctrl - Spatial Reuse control field of SPR element
1670            */
1671           u8 he_spr_ctrl;
1672 
1673           /**
1674            * he_spr_non_srg_obss_pd_max_offset - Non-SRG Maximum TX power offset
1675            */
1676           u8 he_spr_non_srg_obss_pd_max_offset;
1677 
1678           /**
1679            * he_spr_srg_obss_pd_min_offset - Minimum TX power offset
1680            */
1681           u8 he_spr_srg_obss_pd_min_offset;
1682 
1683           /**
1684            * he_spr_srg_obss_pd_max_offset - Maximum TX power offset
1685            */
1686           u8 he_spr_srg_obss_pd_max_offset;
1687 
1688           /**
1689            * he_spr_bss_color_bitmap - BSS color values used by members of the
1690            * SRG.
1691            */
1692           u8 he_spr_bss_color_bitmap[8];
1693 
1694           /**
1695            * he_spr_partial_bssid_bitmap - Partial BSSID values used by members
1696            * of the SRG.
1697            */
1698           u8 he_spr_partial_bssid_bitmap[8];
1699 
1700           /**
1701            * he_bss_color - Whether the BSS Color is disabled
1702            */
1703           int he_bss_color_disabled;
1704 
1705           /**
1706            * he_bss_color_partial - The BSS Color AID equation
1707            */
1708           int he_bss_color_partial;
1709 
1710           /**
1711            * he_bss_color - The BSS Color of the AP
1712            */
1713           int he_bss_color;
1714 
1715           /**
1716            * twt_responder - Whether Target Wait Time responder is enabled
1717            */
1718           int twt_responder;
1719 
1720           /**
1721            * sae_pwe - SAE mechanism for PWE derivation
1722            * 0 = hunting-and-pecking loop only
1723            * 1 = hash-to-element only
1724            * 2 = both hunting-and-pecking loop and hash-to-element enabled
1725            */
1726           enum sae_pwe sae_pwe;
1727 
1728           /**
1729            * FILS Discovery frame minimum interval in TUs
1730            */
1731           u32 fd_min_int;
1732 
1733           /**
1734            * FILS Discovery frame maximum interval in TUs (0 = FD frame disabled)
1735            */
1736           u32 fd_max_int;
1737 
1738           /**
1739            * FILS Discovery frame template data
1740            */
1741           u8 *fd_frame_tmpl;
1742 
1743           /**
1744            * FILS Discovery frame template length
1745            */
1746           size_t fd_frame_tmpl_len;
1747 
1748           /**
1749            * mbssid_tx_iface - Transmitting interface of the MBSSID set
1750            */
1751           const char *mbssid_tx_iface;
1752 
1753           /**
1754            * mbssid_index - The index of this BSS in the MBSSID set
1755            */
1756           unsigned int mbssid_index;
1757 
1758           /**
1759            * mbssid_elem - Buffer containing all MBSSID elements
1760            */
1761           u8 *mbssid_elem;
1762 
1763           /**
1764            * mbssid_elem_len - Total length of all MBSSID elements
1765            */
1766           size_t mbssid_elem_len;
1767 
1768           /**
1769            * mbssid_elem_count - The number of MBSSID elements
1770            */
1771           u8 mbssid_elem_count;
1772 
1773           /**
1774            * mbssid_elem_offset - Offsets to elements in mbssid_elem.
1775            * Kernel will use these offsets to generate multiple BSSID beacons.
1776            */
1777           u8 **mbssid_elem_offset;
1778 
1779           /**
1780            * ema - Enhanced MBSSID advertisements support.
1781            */
1782           bool ema;
1783 
1784           /**
1785            * punct_bitmap - Preamble puncturing bitmap
1786            * Each bit corresponds to a 20 MHz subchannel, the lowest bit for the
1787            * channel with the lowest frequency. A bit set to 1 indicates that the
1788            * subchannel is punctured, otherwise active.
1789            */
1790           u16 punct_bitmap;
1791 
1792           /**
1793            * rnr_elem - This buffer contains all of reduced neighbor report (RNR)
1794            * elements
1795            */
1796           u8 *rnr_elem;
1797 
1798           /**
1799            * rnr_elem_len - Length of rnr_elem buffer
1800            */
1801           size_t rnr_elem_len;
1802 
1803           /**
1804            * rnr_elem_count - Number of RNR elements
1805            */
1806           unsigned int rnr_elem_count;
1807 
1808           /**
1809            * rnr_elem_offset - The offsets to the elements in rnr_elem.
1810            * The driver will use these to include RNR elements in EMA beacons.
1811            */
1812           u8 **rnr_elem_offset;
1813 
1814           /* Unsolicited broadcast Probe Response data */
1815           struct unsol_bcast_probe_resp ubpr;
1816 
1817           /**
1818            * allowed_freqs - List of allowed 20 MHz channel center frequencies in
1819            * MHz for AP operation. Drivers which support this parameter will
1820            * generate a new list based on this provided list by filtering out
1821            * channels that cannot be used at that time due to regulatory or other
1822            * constraints. The resulting list is used as the list of all allowed
1823            * channels whenever performing operations like ACS and DFS.
1824            */
1825           int *allowed_freqs;
1826 
1827           /*
1828            * mld_ap - Whether operating as an AP MLD
1829            */
1830           bool mld_ap;
1831 
1832           /**
1833            * mld_link_id - Link id for MLD BSS's
1834            */
1835           u8 mld_link_id;
1836 
1837           /**
1838            * psk - PSK passed to the driver for 4-way handshake offload
1839            */
1840           u8 psk[PMK_LEN];
1841 
1842           /**
1843            * psk_len - PSK length in bytes (0 = not set)
1844            */
1845           size_t psk_len;
1846 
1847           /**
1848            * sae_password - SAE password for SAE offload
1849            */
1850           const char *sae_password;
1851 };
1852 
1853 struct wpa_driver_mesh_bss_params {
1854 #define WPA_DRIVER_MESH_CONF_FLAG_AUTO_PLINKS               0x00000001
1855 #define WPA_DRIVER_MESH_CONF_FLAG_PEER_LINK_TIMEOUT         0x00000002
1856 #define WPA_DRIVER_MESH_CONF_FLAG_MAX_PEER_LINKS  0x00000004
1857 #define WPA_DRIVER_MESH_CONF_FLAG_HT_OP_MODE                0x00000008
1858 #define WPA_DRIVER_MESH_CONF_FLAG_RSSI_THRESHOLD  0x00000010
1859 #define WPA_DRIVER_MESH_CONF_FLAG_FORWARDING                0x00000020
1860           /*
1861            * TODO: Other mesh configuration parameters would go here.
1862            * See NL80211_MESHCONF_* for all the mesh config parameters.
1863            */
1864           unsigned int flags;
1865           int auto_plinks;
1866           int peer_link_timeout;
1867           int max_peer_links;
1868           int rssi_threshold;
1869           int forwarding;
1870           u16 ht_opmode;
1871 };
1872 
1873 struct wpa_driver_mesh_join_params {
1874           const u8 *meshid;
1875           int meshid_len;
1876           const int *basic_rates;
1877           const u8 *ies;
1878           int ie_len;
1879           struct hostapd_freq_params freq;
1880           int beacon_int;
1881           int dtim_period;
1882           struct wpa_driver_mesh_bss_params conf;
1883 #define WPA_DRIVER_MESH_FLAG_USER_MPM   0x00000001
1884 #define WPA_DRIVER_MESH_FLAG_DRIVER_MPM 0x00000002
1885 #define WPA_DRIVER_MESH_FLAG_SAE_AUTH   0x00000004
1886 #define WPA_DRIVER_MESH_FLAG_AMPE       0x00000008
1887           unsigned int flags;
1888           bool handle_dfs;
1889 };
1890 
1891 struct wpa_driver_set_key_params {
1892           /**
1893            * ifname - Interface name (for multi-SSID/VLAN support) */
1894           const char *ifname;
1895 
1896           /**
1897            * alg - Encryption algorithm
1898            *
1899            * (%WPA_ALG_NONE, %WPA_ALG_WEP, %WPA_ALG_TKIP, %WPA_ALG_CCMP,
1900            * %WPA_ALG_BIP_AES_CMAC_128, %WPA_ALG_GCMP, %WPA_ALG_GCMP_256,
1901            * %WPA_ALG_CCMP_256, %WPA_ALG_BIP_GMAC_128, %WPA_ALG_BIP_GMAC_256,
1902            * %WPA_ALG_BIP_CMAC_256);
1903            * %WPA_ALG_NONE clears the key. */
1904           enum wpa_alg alg;
1905 
1906           /**
1907            * addr - Address of the peer STA
1908            *
1909            * (BSSID of the current AP when setting pairwise key in station mode),
1910            * ff:ff:ff:ff:ff:ff for broadcast keys, %NULL for default keys that
1911            * are used both for broadcast and unicast; when clearing keys, %NULL
1912            * is used to indicate that both the broadcast-only and default key of
1913            * the specified key index is to be cleared */
1914           const u8 *addr;
1915 
1916           /**
1917            * key_idx - Key index
1918            *
1919            * (0..3), usually 0 for unicast keys; 4..5 for IGTK; 6..7 for BIGTK */
1920           int key_idx;
1921 
1922           /**
1923            * set_tx - Configure this key as the default Tx key
1924            *
1925            * Only used when driver does not support separate unicast/individual
1926            * key */
1927           int set_tx;
1928 
1929           /**
1930            * seq - Sequence number/packet number
1931            *
1932            * seq_len octets, the next packet number to be used for in replay
1933            * protection; configured for Rx keys (in most cases, this is only used
1934            * with broadcast keys and set to zero for unicast keys); %NULL if not
1935            * set */
1936           const u8 *seq;
1937 
1938           /**
1939            * seq_len - Length of the seq, depends on the algorithm
1940            *
1941            * TKIP: 6 octets, CCMP/GCMP: 6 octets, IGTK: 6 octets */
1942           size_t seq_len;
1943 
1944           /**
1945            * key - Key buffer
1946            *
1947            * TKIP: 16-byte temporal key, 8-byte Tx Mic key, 8-byte Rx Mic Key */
1948           const u8 *key;
1949 
1950           /**
1951            * key_len - Length of the key buffer in octets
1952            *
1953            * WEP: 5 or 13, TKIP: 32, CCMP/GCMP: 16, IGTK: 16 */
1954           size_t key_len;
1955 
1956           /**
1957            * vlan_id - VLAN index (0..4095) for VLAN offload cases */
1958           int vlan_id;
1959 
1960           /**
1961            * key_flag - Additional key flags
1962            *
1963            * %KEY_FLAG_MODIFY
1964            *  Set when an already installed key must be updated.
1965            *  So far the only use-case is changing RX/TX status for
1966            *  pairwise keys. Must not be set when deleting a key.
1967            * %KEY_FLAG_DEFAULT
1968            *  Set when the key is also a default key. Must not be set when
1969            *  deleting a key.
1970            * %KEY_FLAG_RX
1971            *  The key is valid for RX. Must not be set when deleting a key.
1972            * %KEY_FLAG_TX
1973            *  The key is valid for TX. Must not be set when deleting a key.
1974            * %KEY_FLAG_GROUP
1975            *  The key is a broadcast or group key.
1976            * %KEY_FLAG_PAIRWISE
1977            *  The key is a pairwise key.
1978            * %KEY_FLAG_PMK
1979            *  The key is a Pairwise Master Key (PMK).
1980            *
1981            * Valid and pre-defined combinations are:
1982            * %KEY_FLAG_GROUP_RX_TX
1983            *  WEP key not to be installed as default key.
1984            * %KEY_FLAG_GROUP_RX_TX_DEFAULT
1985            *  Default WEP or WPA-NONE key.
1986            * %KEY_FLAG_GROUP_RX
1987            *  GTK key valid for RX only.
1988            * %KEY_FLAG_GROUP_TX_DEFAULT
1989            *  GTK key valid for TX only, immediately taking over TX.
1990            * %KEY_FLAG_PAIRWISE_RX_TX
1991            *  Pairwise key immediately becoming the active pairwise key.
1992            * %KEY_FLAG_PAIRWISE_RX
1993            *  Pairwise key not yet valid for TX. (Only usable when Extended
1994            *  Key ID is supported by the driver.)
1995            * %KEY_FLAG_PAIRWISE_RX_TX_MODIFY
1996            *  Enable TX for a pairwise key installed with
1997            *  KEY_FLAG_PAIRWISE_RX.
1998            *
1999            * Not a valid standalone key type but pre-defined to be combined
2000            * with other key_flags:
2001            * %KEY_FLAG_RX_TX
2002            *  RX/TX key. */
2003           enum key_flag key_flag;
2004 
2005           /**
2006            * link_id - MLO Link ID
2007            *
2008            * Set to a valid Link ID (0-14) when applicable, otherwise -1. */
2009           int link_id;
2010 };
2011 
2012 enum wpa_driver_if_type {
2013           /**
2014            * WPA_IF_STATION - Station mode interface
2015            */
2016           WPA_IF_STATION,
2017 
2018           /**
2019            * WPA_IF_AP_VLAN - AP mode VLAN interface
2020            *
2021            * This interface shares its address and Beacon frame with the main
2022            * BSS.
2023            */
2024           WPA_IF_AP_VLAN,
2025 
2026           /**
2027            * WPA_IF_AP_BSS - AP mode BSS interface
2028            *
2029            * This interface has its own address and Beacon frame.
2030            */
2031           WPA_IF_AP_BSS,
2032 
2033           /**
2034            * WPA_IF_P2P_GO - P2P Group Owner
2035            */
2036           WPA_IF_P2P_GO,
2037 
2038           /**
2039            * WPA_IF_P2P_CLIENT - P2P Client
2040            */
2041           WPA_IF_P2P_CLIENT,
2042 
2043           /**
2044            * WPA_IF_P2P_GROUP - P2P Group interface (will become either
2045            * WPA_IF_P2P_GO or WPA_IF_P2P_CLIENT, but the role is not yet known)
2046            */
2047           WPA_IF_P2P_GROUP,
2048 
2049           /**
2050            * WPA_IF_P2P_DEVICE - P2P Device interface is used to identify the
2051            * abstracted P2P Device function in the driver
2052            */
2053           WPA_IF_P2P_DEVICE,
2054 
2055           /*
2056            * WPA_IF_MESH - Mesh interface
2057            */
2058           WPA_IF_MESH,
2059 
2060           /*
2061            * WPA_IF_TDLS - TDLS offchannel interface (used for pref freq only)
2062            */
2063           WPA_IF_TDLS,
2064 
2065           /*
2066            * WPA_IF_IBSS - IBSS interface (used for pref freq only)
2067            */
2068           WPA_IF_IBSS,
2069 
2070           /*
2071            * WPA_IF_NAN - NAN Device
2072            */
2073           WPA_IF_NAN,
2074 
2075           /* keep last */
2076           WPA_IF_MAX
2077 };
2078 
2079 /**
2080  * struct wpa_driver_capa - Driver capability information
2081  */
2082 struct wpa_driver_capa {
2083 #define WPA_DRIVER_CAPA_KEY_MGMT_WPA              0x00000001
2084 #define WPA_DRIVER_CAPA_KEY_MGMT_WPA2             0x00000002
2085 #define WPA_DRIVER_CAPA_KEY_MGMT_WPA_PSK          0x00000004
2086 #define WPA_DRIVER_CAPA_KEY_MGMT_WPA2_PSK         0x00000008
2087 #define WPA_DRIVER_CAPA_KEY_MGMT_WPA_NONE         0x00000010
2088 #define WPA_DRIVER_CAPA_KEY_MGMT_FT               0x00000020
2089 #define WPA_DRIVER_CAPA_KEY_MGMT_FT_PSK           0x00000040
2090 #define WPA_DRIVER_CAPA_KEY_MGMT_WAPI_PSK         0x00000080
2091 #define WPA_DRIVER_CAPA_KEY_MGMT_SUITE_B          0x00000100
2092 #define WPA_DRIVER_CAPA_KEY_MGMT_SUITE_B_192      0x00000200
2093 #define WPA_DRIVER_CAPA_KEY_MGMT_OWE              0x00000400
2094 #define WPA_DRIVER_CAPA_KEY_MGMT_DPP              0x00000800
2095 #define WPA_DRIVER_CAPA_KEY_MGMT_FILS_SHA256    0x00001000
2096 #define WPA_DRIVER_CAPA_KEY_MGMT_FILS_SHA384    0x00002000
2097 #define WPA_DRIVER_CAPA_KEY_MGMT_FT_FILS_SHA256 0x00004000
2098 #define WPA_DRIVER_CAPA_KEY_MGMT_FT_FILS_SHA384 0x00008000
2099 #define WPA_DRIVER_CAPA_KEY_MGMT_SAE              0x00010000
2100 #define WPA_DRIVER_CAPA_KEY_MGMT_802_1X_SHA256    0x00020000
2101 #define WPA_DRIVER_CAPA_KEY_MGMT_PSK_SHA256       0x00040000
2102 #define WPA_DRIVER_CAPA_KEY_MGMT_TPK_HANDSHAKE    0x00080000
2103 #define WPA_DRIVER_CAPA_KEY_MGMT_FT_SAE           0x00100000
2104 #define WPA_DRIVER_CAPA_KEY_MGMT_FT_802_1X_SHA384 0x00200000
2105 #define WPA_DRIVER_CAPA_KEY_MGMT_CCKM             0x00400000
2106 #define WPA_DRIVER_CAPA_KEY_MGMT_OSEN             0x00800000
2107 #define WPA_DRIVER_CAPA_KEY_MGMT_SAE_EXT_KEY      0x01000000
2108 #define WPA_DRIVER_CAPA_KEY_MGMT_FT_SAE_EXT_KEY   0x02000000
2109           /** Bitfield of supported key management suites */
2110           unsigned int key_mgmt;
2111           unsigned int key_mgmt_iftype[WPA_IF_MAX];
2112 
2113 #define WPA_DRIVER_CAPA_ENC_WEP40       0x00000001
2114 #define WPA_DRIVER_CAPA_ENC_WEP104      0x00000002
2115 #define WPA_DRIVER_CAPA_ENC_TKIP        0x00000004
2116 #define WPA_DRIVER_CAPA_ENC_CCMP        0x00000008
2117 #define WPA_DRIVER_CAPA_ENC_WEP128      0x00000010
2118 #define WPA_DRIVER_CAPA_ENC_GCMP        0x00000020
2119 #define WPA_DRIVER_CAPA_ENC_GCMP_256    0x00000040
2120 #define WPA_DRIVER_CAPA_ENC_CCMP_256    0x00000080
2121 #define WPA_DRIVER_CAPA_ENC_BIP                   0x00000100
2122 #define WPA_DRIVER_CAPA_ENC_BIP_GMAC_128          0x00000200
2123 #define WPA_DRIVER_CAPA_ENC_BIP_GMAC_256          0x00000400
2124 #define WPA_DRIVER_CAPA_ENC_BIP_CMAC_256          0x00000800
2125 #define WPA_DRIVER_CAPA_ENC_GTK_NOT_USED          0x00001000
2126           /** Bitfield of supported cipher suites */
2127           unsigned int enc;
2128 
2129 #define WPA_DRIVER_AUTH_OPEN            0x00000001
2130 #define WPA_DRIVER_AUTH_SHARED                    0x00000002
2131 #define WPA_DRIVER_AUTH_LEAP            0x00000004
2132           /** Bitfield of supported IEEE 802.11 authentication algorithms */
2133           unsigned int auth;
2134 
2135 /** Driver generated WPA/RSN IE */
2136 #define WPA_DRIVER_FLAGS_DRIVER_IE      0x00000001
2137 /** Driver needs static WEP key setup after association command */
2138 #define WPA_DRIVER_FLAGS_SET_KEYS_AFTER_ASSOC 0x00000002
2139 /** Driver takes care of all DFS operations */
2140 #define WPA_DRIVER_FLAGS_DFS_OFFLOAD                        0x00000004
2141 /** Driver takes care of RSN 4-way handshake internally; PMK is configured with
2142  * struct wpa_driver_ops::set_key using key_flag = KEY_FLAG_PMK */
2143 #define WPA_DRIVER_FLAGS_4WAY_HANDSHAKE_8021X               0x00000008
2144 /** Driver is for a wired Ethernet interface */
2145 #define WPA_DRIVER_FLAGS_WIRED                    0x00000010
2146 /** Driver provides separate commands for authentication and association (SME in
2147  * wpa_supplicant). */
2148 #define WPA_DRIVER_FLAGS_SME            0x00000020
2149 /** Driver supports AP mode */
2150 #define WPA_DRIVER_FLAGS_AP             0x00000040
2151 /** Driver needs static WEP key setup after association has been completed */
2152 #define WPA_DRIVER_FLAGS_SET_KEYS_AFTER_ASSOC_DONE          0x00000080
2153 /** Driver supports dynamic HT 20/40 MHz channel changes during BSS lifetime */
2154 #define WPA_DRIVER_FLAGS_HT_2040_COEX                       0x00000100
2155 /** Driver supports concurrent P2P operations */
2156 #define WPA_DRIVER_FLAGS_P2P_CONCURRENT 0x00000200
2157 /**
2158  * Driver uses the initial interface as a dedicated management interface, i.e.,
2159  * it cannot be used for P2P group operations or non-P2P purposes.
2160  */
2161 #define WPA_DRIVER_FLAGS_P2P_DEDICATED_INTERFACE  0x00000400
2162 /** This interface is P2P capable (P2P GO or P2P Client) */
2163 #define WPA_DRIVER_FLAGS_P2P_CAPABLE    0x00000800
2164 /** Driver supports station and key removal when stopping an AP */
2165 #define WPA_DRIVER_FLAGS_AP_TEARDOWN_SUPPORT                0x00001000
2166 /**
2167  * Driver uses the initial interface for P2P management interface and non-P2P
2168  * purposes (e.g., connect to infra AP), but this interface cannot be used for
2169  * P2P group operations.
2170  */
2171 #define WPA_DRIVER_FLAGS_P2P_MGMT_AND_NON_P2P               0x00002000
2172 /**
2173  * Driver is known to use valid error codes, i.e., when it indicates that
2174  * something (e.g., association) fails, there was indeed a failure and the
2175  * operation does not end up getting completed successfully later.
2176  */
2177 #define WPA_DRIVER_FLAGS_VALID_ERROR_CODES                  0x00004000
2178 /** Driver supports off-channel TX */
2179 #define WPA_DRIVER_FLAGS_OFFCHANNEL_TX                      0x00008000
2180 /** Driver indicates TX status events for EAPOL Data frames */
2181 #define WPA_DRIVER_FLAGS_EAPOL_TX_STATUS                    0x00010000
2182 /** Driver indicates TX status events for Deauth/Disassoc frames */
2183 #define WPA_DRIVER_FLAGS_DEAUTH_TX_STATUS                   0x00020000
2184 /** Driver supports roaming (BSS selection) in firmware */
2185 #define WPA_DRIVER_FLAGS_BSS_SELECTION                      0x00040000
2186 /** Driver supports operating as a TDLS peer */
2187 #define WPA_DRIVER_FLAGS_TDLS_SUPPORT                       0x00080000
2188 /** Driver requires external TDLS setup/teardown/discovery */
2189 #define WPA_DRIVER_FLAGS_TDLS_EXTERNAL_SETUP                0x00100000
2190 /** Driver indicates support for Probe Response offloading in AP mode */
2191 #define WPA_DRIVER_FLAGS_PROBE_RESP_OFFLOAD                 0x00200000
2192 /** Driver supports U-APSD in AP mode */
2193 #define WPA_DRIVER_FLAGS_AP_UAPSD                           0x00400000
2194 /** Driver supports inactivity timer in AP mode */
2195 #define WPA_DRIVER_FLAGS_INACTIVITY_TIMER                   0x00800000
2196 /** Driver expects user space implementation of MLME in AP mode */
2197 #define WPA_DRIVER_FLAGS_AP_MLME                            0x01000000
2198 /** Driver supports SAE with user space SME */
2199 #define WPA_DRIVER_FLAGS_SAE                                0x02000000
2200 /** Driver makes use of OBSS scan mechanism in wpa_supplicant */
2201 #define WPA_DRIVER_FLAGS_OBSS_SCAN                          0x04000000
2202 /** Driver supports IBSS (Ad-hoc) mode */
2203 #define WPA_DRIVER_FLAGS_IBSS                               0x08000000
2204 /** Driver supports radar detection */
2205 #define WPA_DRIVER_FLAGS_RADAR                                        0x10000000
2206 /** Driver supports a dedicated interface for P2P Device */
2207 #define WPA_DRIVER_FLAGS_DEDICATED_P2P_DEVICE               0x20000000
2208 /** Driver supports QoS Mapping */
2209 #define WPA_DRIVER_FLAGS_QOS_MAPPING                        0x40000000
2210 /** Driver supports CSA in AP mode */
2211 #define WPA_DRIVER_FLAGS_AP_CSA                                       0x80000000
2212 /** Driver supports mesh */
2213 #define WPA_DRIVER_FLAGS_MESH                     0x0000000100000000ULL
2214 /** Driver support ACS offload */
2215 #define WPA_DRIVER_FLAGS_ACS_OFFLOAD              0x0000000200000000ULL
2216 /** Driver supports key management offload */
2217 #define WPA_DRIVER_FLAGS_KEY_MGMT_OFFLOAD         0x0000000400000000ULL
2218 /** Driver supports TDLS channel switching */
2219 #define WPA_DRIVER_FLAGS_TDLS_CHANNEL_SWITCH      0x0000000800000000ULL
2220 /** Driver supports IBSS with HT datarates */
2221 #define WPA_DRIVER_FLAGS_HT_IBSS                  0x0000001000000000ULL
2222 /** Driver supports IBSS with VHT datarates */
2223 #define WPA_DRIVER_FLAGS_VHT_IBSS                 0x0000002000000000ULL
2224 /** Driver supports automatic band selection */
2225 #define WPA_DRIVER_FLAGS_SUPPORT_HW_MODE_ANY      0x0000004000000000ULL
2226 /** Driver supports simultaneous off-channel operations */
2227 #define WPA_DRIVER_FLAGS_OFFCHANNEL_SIMULTANEOUS  0x0000008000000000ULL
2228 /** Driver supports full AP client state */
2229 #define WPA_DRIVER_FLAGS_FULL_AP_CLIENT_STATE     0x0000010000000000ULL
2230 /** Driver supports P2P Listen offload */
2231 #define WPA_DRIVER_FLAGS_P2P_LISTEN_OFFLOAD     0x0000020000000000ULL
2232 /** Driver supports FILS */
2233 #define WPA_DRIVER_FLAGS_SUPPORT_FILS             0x0000040000000000ULL
2234 /** Driver supports Beacon frame TX rate configuration (legacy rates) */
2235 #define WPA_DRIVER_FLAGS_BEACON_RATE_LEGACY       0x0000080000000000ULL
2236 /** Driver supports Beacon frame TX rate configuration (HT rates) */
2237 #define WPA_DRIVER_FLAGS_BEACON_RATE_HT           0x0000100000000000ULL
2238 /** Driver supports Beacon frame TX rate configuration (VHT rates) */
2239 #define WPA_DRIVER_FLAGS_BEACON_RATE_VHT          0x0000200000000000ULL
2240 /** Driver supports mgmt_tx with random TX address in non-connected state */
2241 #define WPA_DRIVER_FLAGS_MGMT_TX_RANDOM_TA        0x0000400000000000ULL
2242 /** Driver supports mgmt_tx with random TX addr in connected state */
2243 #define WPA_DRIVER_FLAGS_MGMT_TX_RANDOM_TA_CONNECTED        0x0000800000000000ULL
2244 /** Driver supports better BSS reporting with sched_scan in connected mode */
2245 #define WPA_DRIVER_FLAGS_SCHED_SCAN_RELATIVE_RSSI 0x0001000000000000ULL
2246 /** Driver supports HE capabilities */
2247 #define WPA_DRIVER_FLAGS_HE_CAPABILITIES          0x0002000000000000ULL
2248 /** Driver supports FILS shared key offload */
2249 #define WPA_DRIVER_FLAGS_FILS_SK_OFFLOAD          0x0004000000000000ULL
2250 /** Driver supports all OCE STA specific mandatory features */
2251 #define WPA_DRIVER_FLAGS_OCE_STA                  0x0008000000000000ULL
2252 /** Driver supports all OCE AP specific mandatory features */
2253 #define WPA_DRIVER_FLAGS_OCE_AP                             0x0010000000000000ULL
2254 /**
2255  * Driver supports all OCE STA-CFON specific mandatory features only.
2256  * If a driver sets this bit but not the %WPA_DRIVER_FLAGS_OCE_AP, the
2257  * userspace shall assume that this driver may not support all OCE AP
2258  * functionality but can support only OCE STA-CFON functionality.
2259  */
2260 #define WPA_DRIVER_FLAGS_OCE_STA_CFON             0x0020000000000000ULL
2261 /** Driver supports MFP-optional in the connect command */
2262 #define WPA_DRIVER_FLAGS_MFP_OPTIONAL             0x0040000000000000ULL
2263 /** Driver is a self-managed regulatory device */
2264 #define WPA_DRIVER_FLAGS_SELF_MANAGED_REGULATORY       0x0080000000000000ULL
2265 /** Driver supports FTM responder functionality */
2266 #define WPA_DRIVER_FLAGS_FTM_RESPONDER            0x0100000000000000ULL
2267 /** Driver support 4-way handshake offload for WPA-Personal */
2268 #define WPA_DRIVER_FLAGS_4WAY_HANDSHAKE_PSK       0x0200000000000000ULL
2269 /** Driver supports a separate control port TX for EAPOL frames */
2270 #define WPA_DRIVER_FLAGS_CONTROL_PORT             0x0400000000000000ULL
2271 /** Driver supports VLAN offload */
2272 #define WPA_DRIVER_FLAGS_VLAN_OFFLOAD             0x0800000000000000ULL
2273 /** Driver supports UPDATE_FT_IES command */
2274 #define WPA_DRIVER_FLAGS_UPDATE_FT_IES            0x1000000000000000ULL
2275 /** Driver can correctly rekey PTKs without Extended Key ID */
2276 #define WPA_DRIVER_FLAGS_SAFE_PTK0_REKEYS         0x2000000000000000ULL
2277 /** Driver supports Beacon protection */
2278 #define WPA_DRIVER_FLAGS_BEACON_PROTECTION        0x4000000000000000ULL
2279 /** Driver supports Extended Key ID */
2280 #define WPA_DRIVER_FLAGS_EXTENDED_KEY_ID          0x8000000000000000ULL
2281           u64 flags;
2282 
2283 /** Driver supports a separate control port RX for EAPOL frames */
2284 #define WPA_DRIVER_FLAGS2_CONTROL_PORT_RX         0x0000000000000001ULL
2285 /** Driver supports TX status reports for EAPOL frames through control port */
2286 #define WPA_DRIVER_FLAGS2_CONTROL_PORT_TX_STATUS 0x0000000000000002ULL
2287 /** Driver supports secure LTF in AP mode */
2288 #define WPA_DRIVER_FLAGS2_SEC_LTF_AP              0x0000000000000004ULL
2289 /** Driver supports secure RTT measurement exchange in AP mode */
2290 #define WPA_DRIVER_FLAGS2_SEC_RTT_AP              0x0000000000000008ULL
2291 /**
2292  * Driver supports protection of range negotiation and measurement management
2293  * frames in AP mode
2294  */
2295 #define WPA_DRIVER_FLAGS2_PROT_RANGE_NEG_AP       0x0000000000000010ULL
2296 /** Driver supports Beacon frame TX rate configuration (HE rates) */
2297 #define WPA_DRIVER_FLAGS2_BEACON_RATE_HE          0x0000000000000020ULL
2298 /** Driver supports Beacon protection only in client mode */
2299 #define WPA_DRIVER_FLAGS2_BEACON_PROTECTION_CLIENT 0x0000000000000040ULL
2300 /** Driver supports Operating Channel Validation */
2301 #define WPA_DRIVER_FLAGS2_OCV                     0x0000000000000080ULL
2302 /** Driver expects user space implementation of SME in AP mode */
2303 #define WPA_DRIVER_FLAGS2_AP_SME                  0x0000000000000100ULL
2304 /** Driver handles SA Query procedures in AP mode */
2305 #define WPA_DRIVER_FLAGS2_SA_QUERY_OFFLOAD_AP     0x0000000000000200ULL
2306 /** Driver supports background radar/CAC detection */
2307 #define WPA_DRIVER_FLAGS2_RADAR_BACKGROUND        0x0000000000000400ULL
2308 /** Driver supports secure LTF in STA mode */
2309 #define WPA_DRIVER_FLAGS2_SEC_LTF_STA             0x0000000000000800ULL
2310 /** Driver supports secure RTT measurement exchange in STA mode */
2311 #define WPA_DRIVER_FLAGS2_SEC_RTT_STA             0x0000000000001000ULL
2312 /**
2313  * Driver supports protection of range negotiation and measurement management
2314  * frames in STA mode
2315  */
2316 #define WPA_DRIVER_FLAGS2_PROT_RANGE_NEG_STA      0x0000000000002000ULL
2317 /** Driver supports MLO in station/AP mode */
2318 #define WPA_DRIVER_FLAGS2_MLO                     0x0000000000004000ULL
2319 /** Driver supports minimal scan request probe content  */
2320 #define WPA_DRIVER_FLAGS2_SCAN_MIN_PREQ         0x0000000000008000ULL
2321 /** Driver supports SAE authentication offload in STA mode */
2322 #define WPA_DRIVER_FLAGS2_SAE_OFFLOAD_STA         0x0000000000010000ULL
2323 /** Driver support AP_PSK authentication offload */
2324 #define WPA_DRIVER_FLAGS2_4WAY_HANDSHAKE_AP_PSK   0x0000000000020000ULL
2325 /** Driver supports OWE STA offload */
2326 #define WPA_DRIVER_FLAGS2_OWE_OFFLOAD_STA         0x0000000000040000ULL
2327 /** Driver supports OWE AP offload */
2328 #define WPA_DRIVER_FLAGS2_OWE_OFFLOAD_AP          0x0000000000080000ULL
2329 /** Driver support AP SAE authentication offload */
2330 #define WPA_DRIVER_FLAGS2_SAE_OFFLOAD_AP          0x0000000000100000ULL
2331 /** Driver supports TWT responder in HT and VHT modes */
2332 #define WPA_DRIVER_FLAGS2_HT_VHT_TWT_RESPONDER    0x0000000000200000ULL
2333           u64 flags2;
2334 
2335 #define FULL_AP_CLIENT_STATE_SUPP(drv_flags) \
2336           (drv_flags & WPA_DRIVER_FLAGS_FULL_AP_CLIENT_STATE)
2337 
2338           unsigned int wmm_ac_supported:1;
2339 
2340           unsigned int mac_addr_rand_scan_supported:1;
2341           unsigned int mac_addr_rand_sched_scan_supported:1;
2342 
2343           /** Maximum number of supported active probe SSIDs */
2344           int max_scan_ssids;
2345 
2346           /** Maximum number of supported active probe SSIDs for sched_scan */
2347           int max_sched_scan_ssids;
2348 
2349           /** Maximum number of supported scan plans for scheduled scan */
2350           unsigned int max_sched_scan_plans;
2351 
2352           /** Maximum interval in a scan plan. In seconds */
2353           u32 max_sched_scan_plan_interval;
2354 
2355           /** Maximum number of iterations in a single scan plan */
2356           u32 max_sched_scan_plan_iterations;
2357 
2358           /** Whether sched_scan (offloaded scanning) is supported */
2359           int sched_scan_supported;
2360 
2361           /** Maximum number of supported match sets for sched_scan */
2362           int max_match_sets;
2363 
2364           /**
2365            * max_remain_on_chan - Maximum remain-on-channel duration in msec
2366            */
2367           unsigned int max_remain_on_chan;
2368 
2369           /**
2370            * max_stations - Maximum number of associated stations the driver
2371            * supports in AP mode
2372            */
2373           unsigned int max_stations;
2374 
2375           /**
2376            * probe_resp_offloads - Bitmap of supported protocols by the driver
2377            * for Probe Response offloading.
2378            */
2379 /** Driver Probe Response offloading support for WPS ver. 1 */
2380 #define WPA_DRIVER_PROBE_RESP_OFFLOAD_WPS                   0x00000001
2381 /** Driver Probe Response offloading support for WPS ver. 2 */
2382 #define WPA_DRIVER_PROBE_RESP_OFFLOAD_WPS2                  0x00000002
2383 /** Driver Probe Response offloading support for P2P */
2384 #define WPA_DRIVER_PROBE_RESP_OFFLOAD_P2P                   0x00000004
2385 /** Driver Probe Response offloading support for IEEE 802.11u (Interworking) */
2386 #define WPA_DRIVER_PROBE_RESP_OFFLOAD_INTERWORKING          0x00000008
2387           unsigned int probe_resp_offloads;
2388 
2389           unsigned int max_acl_mac_addrs;
2390 
2391           /**
2392            * Number of supported concurrent channels
2393            */
2394           unsigned int num_multichan_concurrent;
2395 
2396           /**
2397            * extended_capa - extended capabilities in driver/device
2398            *
2399            * Must be allocated and freed by driver and the pointers must be
2400            * valid for the lifetime of the driver, i.e., freed in deinit()
2401            */
2402           const u8 *extended_capa, *extended_capa_mask;
2403           unsigned int extended_capa_len;
2404 
2405           struct wowlan_triggers wowlan_triggers;
2406 
2407 /** Driver adds the DS Params Set IE in Probe Request frames */
2408 #define WPA_DRIVER_FLAGS_DS_PARAM_SET_IE_IN_PROBES          0x00000001
2409 /** Driver adds the WFA TPC IE in Probe Request frames */
2410 #define WPA_DRIVER_FLAGS_WFA_TPC_IE_IN_PROBES               0x00000002
2411 /** Driver handles quiet period requests */
2412 #define WPA_DRIVER_FLAGS_QUIET                                        0x00000004
2413 /**
2414  * Driver is capable of inserting the current TX power value into the body of
2415  * transmitted frames.
2416  * Background: Some Action frames include a TPC Report IE. This IE contains a
2417  * TX power field, which has to be updated by lower layers. One such Action
2418  * frame is Link Measurement Report (part of RRM). Another is TPC Report (part
2419  * of spectrum management). Note that this insertion takes place at a fixed
2420  * offset, namely the 6th byte in the Action frame body.
2421  */
2422 #define WPA_DRIVER_FLAGS_TX_POWER_INSERTION                 0x00000008
2423 /**
2424  * Driver supports RRM. With this support, the driver will accept to use RRM in
2425  * (Re)Association Request frames, without supporting quiet period.
2426  */
2427 #define WPA_DRIVER_FLAGS_SUPPORT_RRM                        0x00000010
2428 
2429 /** Driver supports setting the scan dwell time */
2430 #define WPA_DRIVER_FLAGS_SUPPORT_SET_SCAN_DWELL             0x00000020
2431 /** Driver supports Beacon Report Measurement */
2432 #define WPA_DRIVER_FLAGS_SUPPORT_BEACON_REPORT              0x00000040
2433 
2434           u32 rrm_flags;
2435 
2436           /* Driver concurrency capabilities */
2437           unsigned int conc_capab;
2438           /* Maximum number of concurrent channels on 2.4 GHz */
2439           unsigned int max_conc_chan_2_4;
2440           /* Maximum number of concurrent channels on 5 GHz */
2441           unsigned int max_conc_chan_5_0;
2442 
2443           /* Maximum number of supported CSA counters */
2444           u16 max_csa_counters;
2445 
2446           /* Maximum number of supported AKM suites in commands */
2447           unsigned int max_num_akms;
2448 
2449           /* Maximum number of interfaces supported for MBSSID advertisement */
2450           unsigned int mbssid_max_interfaces;
2451           /* Maximum profile periodicity for enhanced MBSSID advertisement */
2452           unsigned int ema_max_periodicity;
2453 };
2454 
2455 
2456 struct hostapd_data;
2457 
2458 enum guard_interval {
2459           GUARD_INTERVAL_0_4 = 1,
2460           GUARD_INTERVAL_0_8 = 2,
2461           GUARD_INTERVAL_1_6 = 3,
2462           GUARD_INTERVAL_3_2 = 4,
2463 };
2464 
2465 #define STA_DRV_DATA_TX_MCS BIT(0)
2466 #define STA_DRV_DATA_RX_MCS BIT(1)
2467 #define STA_DRV_DATA_TX_VHT_MCS BIT(2)
2468 #define STA_DRV_DATA_RX_VHT_MCS BIT(3)
2469 #define STA_DRV_DATA_TX_VHT_NSS BIT(4)
2470 #define STA_DRV_DATA_RX_VHT_NSS BIT(5)
2471 #define STA_DRV_DATA_TX_SHORT_GI BIT(6)
2472 #define STA_DRV_DATA_RX_SHORT_GI BIT(7)
2473 #define STA_DRV_DATA_LAST_ACK_RSSI BIT(8)
2474 #define STA_DRV_DATA_CONN_TIME BIT(9)
2475 #define STA_DRV_DATA_TX_HE_MCS BIT(10)
2476 #define STA_DRV_DATA_RX_HE_MCS BIT(11)
2477 #define STA_DRV_DATA_TX_HE_NSS BIT(12)
2478 #define STA_DRV_DATA_RX_HE_NSS BIT(13)
2479 #define STA_DRV_DATA_TX_HE_DCM BIT(14)
2480 #define STA_DRV_DATA_RX_HE_DCM BIT(15)
2481 #define STA_DRV_DATA_TX_HE_GI BIT(16)
2482 #define STA_DRV_DATA_RX_HE_GI BIT(17)
2483 
2484 struct hostap_sta_driver_data {
2485           unsigned long rx_packets, tx_packets;
2486           unsigned long long rx_bytes, tx_bytes;
2487           unsigned long long rx_airtime, tx_airtime;
2488           unsigned long long beacons_count;
2489           int bytes_64bit; /* whether 64-bit byte counters are supported */
2490           unsigned long current_tx_rate; /* in kbps */
2491           unsigned long current_rx_rate; /* in kbps */
2492           unsigned long inactive_msec;
2493           unsigned long connected_sec;
2494           unsigned long flags; /* bitfield of STA_DRV_DATA_* */
2495           unsigned long num_ps_buf_frames;
2496           unsigned long tx_retry_failed;
2497           unsigned long tx_retry_count;
2498           s8 last_ack_rssi;
2499           unsigned long backlog_packets;
2500           unsigned long backlog_bytes;
2501           unsigned long fcs_error_count;
2502           unsigned long beacon_loss_count;
2503           unsigned long expected_throughput;
2504           unsigned long rx_drop_misc;
2505           unsigned long rx_mpdus;
2506           int signal; /* dBm; or -WPA_INVALID_NOISE */
2507           u8 rx_hemcs;
2508           u8 tx_hemcs;
2509           u8 rx_vhtmcs;
2510           u8 tx_vhtmcs;
2511           u8 rx_mcs;
2512           u8 tx_mcs;
2513           u8 rx_he_nss;
2514           u8 tx_he_nss;
2515           u8 rx_vht_nss;
2516           u8 tx_vht_nss;
2517           s8 avg_signal; /* dBm */
2518           s8 avg_beacon_signal; /* dBm */
2519           s8 avg_ack_signal; /* dBm */
2520           enum guard_interval rx_guard_interval, tx_guard_interval;
2521           u8 rx_dcm, tx_dcm;
2522 };
2523 
2524 struct hostapd_sta_add_params {
2525           const u8 *addr;
2526           u16 aid;
2527           u16 capability;
2528           const u8 *supp_rates;
2529           size_t supp_rates_len;
2530           u16 listen_interval;
2531           const struct ieee80211_ht_capabilities *ht_capabilities;
2532           const struct ieee80211_vht_capabilities *vht_capabilities;
2533           int vht_opmode_enabled;
2534           u8 vht_opmode;
2535           const struct ieee80211_he_capabilities *he_capab;
2536           size_t he_capab_len;
2537           const struct ieee80211_he_6ghz_band_cap *he_6ghz_capab;
2538           const struct ieee80211_eht_capabilities *eht_capab;
2539           size_t eht_capab_len;
2540           u32 flags; /* bitmask of WPA_STA_* flags */
2541           u32 flags_mask; /* unset bits in flags */
2542 #ifdef CONFIG_MESH
2543           enum mesh_plink_state plink_state;
2544           u16 peer_aid;
2545 #endif /* CONFIG_MESH */
2546           int set; /* Set STA parameters instead of add */
2547           u8 qosinfo;
2548           const u8 *ext_capab;
2549           size_t ext_capab_len;
2550           const u8 *supp_channels;
2551           size_t supp_channels_len;
2552           const u8 *supp_oper_classes;
2553           size_t supp_oper_classes_len;
2554           int support_p2p_ps;
2555 
2556           bool mld_link_sta;
2557           s8 mld_link_id;
2558           const u8 *mld_link_addr;
2559 };
2560 
2561 struct mac_address {
2562           u8 addr[ETH_ALEN];
2563 };
2564 
2565 struct hostapd_acl_params {
2566           u8 acl_policy;
2567           unsigned int num_mac_acl;
2568           struct mac_address mac_acl[0];
2569 };
2570 
2571 struct wpa_init_params {
2572           void *global_priv;
2573           const u8 *bssid;
2574           const char *ifname;
2575           const char *driver_params;
2576           int use_pae_group_addr;
2577           char **bridge;
2578           size_t num_bridge;
2579 
2580           u8 *own_addr; /* buffer for writing own MAC address */
2581 };
2582 
2583 
2584 struct wpa_bss_params {
2585           /** Interface name (for multi-SSID/VLAN support) */
2586           const char *ifname;
2587           /** Whether IEEE 802.1X or WPA/WPA2 is enabled */
2588           int enabled;
2589 
2590           int wpa;
2591           int ieee802_1x;
2592           int wpa_group;
2593           int wpa_pairwise;
2594           int wpa_key_mgmt;
2595           int rsn_preauth;
2596           enum mfp_options ieee80211w;
2597 };
2598 
2599 #define WPA_STA_AUTHORIZED BIT(0)
2600 #define WPA_STA_WMM BIT(1)
2601 #define WPA_STA_SHORT_PREAMBLE BIT(2)
2602 #define WPA_STA_MFP BIT(3)
2603 #define WPA_STA_TDLS_PEER BIT(4)
2604 #define WPA_STA_AUTHENTICATED BIT(5)
2605 #define WPA_STA_ASSOCIATED BIT(6)
2606 
2607 enum tdls_oper {
2608           TDLS_DISCOVERY_REQ,
2609           TDLS_SETUP,
2610           TDLS_TEARDOWN,
2611           TDLS_ENABLE_LINK,
2612           TDLS_DISABLE_LINK,
2613           TDLS_ENABLE,
2614           TDLS_DISABLE
2615 };
2616 
2617 enum wnm_oper {
2618           WNM_SLEEP_ENTER_CONFIRM,
2619           WNM_SLEEP_ENTER_FAIL,
2620           WNM_SLEEP_EXIT_CONFIRM,
2621           WNM_SLEEP_EXIT_FAIL,
2622           WNM_SLEEP_TFS_REQ_IE_ADD,   /* STA requests driver to add TFS req IE */
2623           WNM_SLEEP_TFS_REQ_IE_NONE,  /* STA requests empty TFS req IE */
2624           WNM_SLEEP_TFS_REQ_IE_SET,   /* AP requests driver to set TFS req IE for
2625                                              * a STA */
2626           WNM_SLEEP_TFS_RESP_IE_ADD,  /* AP requests driver to add TFS resp IE
2627                                              * for a STA */
2628           WNM_SLEEP_TFS_RESP_IE_NONE, /* AP requests empty TFS resp IE */
2629           WNM_SLEEP_TFS_RESP_IE_SET,  /* AP requests driver to set TFS resp IE
2630                                              * for a STA */
2631           WNM_SLEEP_TFS_IE_DEL        /* AP delete the TFS IE */
2632 };
2633 
2634 /* enum smps_mode - SMPS mode definitions */
2635 enum smps_mode {
2636           SMPS_AUTOMATIC,
2637           SMPS_OFF,
2638           SMPS_DYNAMIC,
2639           SMPS_STATIC,
2640 
2641           /* Keep last */
2642           SMPS_INVALID,
2643 };
2644 
2645 #define WPA_INVALID_NOISE 9999
2646 
2647 /**
2648  * struct wpa_signal_info - Information about channel signal quality
2649  * @frequency: control frequency
2650  * @above_threshold: true if the above threshold was crossed
2651  *        (relevant for a CQM event)
2652  * @data: STA information
2653  * @current_noise: %WPA_INVALID_NOISE if not supported
2654  * @chanwidth: channel width
2655  * @center_frq1: center frequency for the first segment
2656  * @center_frq2: center frequency for the second segment (if relevant)
2657  */
2658 struct wpa_signal_info {
2659           u32 frequency;
2660           int above_threshold;
2661           struct hostap_sta_driver_data data;
2662           int current_noise;
2663           enum chan_width chanwidth;
2664           int center_frq1;
2665           int center_frq2;
2666 };
2667 
2668 struct wpa_mlo_signal_info {
2669           u16 valid_links;
2670           struct wpa_signal_info links[MAX_NUM_MLD_LINKS];
2671 };
2672 
2673 /**
2674  * struct wpa_channel_info - Information about the current channel
2675  * @frequency: Center frequency of the primary 20 MHz channel
2676  * @chanwidth: Width of the current operating channel
2677  * @sec_channel: Location of the secondary 20 MHz channel (either +1 or -1).
2678  *        This field is only filled in when using a 40 MHz channel.
2679  * @center_frq1: Center frequency of frequency segment 0
2680  * @center_frq2: Center frequency of frequency segment 1 (for 80+80 channels)
2681  * @seg1_idx: Frequency segment 1 index when using a 80+80 channel. This is
2682  *        derived from center_frq2 for convenience.
2683  */
2684 struct wpa_channel_info {
2685           u32 frequency;
2686           enum chan_width chanwidth;
2687           int sec_channel;
2688           int center_frq1;
2689           int center_frq2;
2690           u8 seg1_idx;
2691 };
2692 
2693 /**
2694  * struct beacon_data - Beacon data
2695  * @head: Head portion of Beacon frame (before TIM IE)
2696  * @tail: Tail portion of Beacon frame (after TIM IE)
2697  * @beacon_ies: Extra information element(s) to add into Beacon frames or %NULL
2698  * @proberesp_ies: Extra information element(s) to add into Probe Response
2699  *        frames or %NULL
2700  * @assocresp_ies: Extra information element(s) to add into (Re)Association
2701  *        Response frames or %NULL
2702  * @probe_resp: Probe Response frame template
2703  * @head_len: Length of @head
2704  * @tail_len: Length of @tail
2705  * @beacon_ies_len: Length of beacon_ies in octets
2706  * @proberesp_ies_len: Length of proberesp_ies in octets
2707  * @proberesp_ies_len: Length of proberesp_ies in octets
2708  * @probe_resp_len: Length of probe response template (@probe_resp)
2709  */
2710 struct beacon_data {
2711           u8 *head, *tail;
2712           u8 *beacon_ies;
2713           u8 *proberesp_ies;
2714           u8 *assocresp_ies;
2715           u8 *probe_resp;
2716 
2717           size_t head_len, tail_len;
2718           size_t beacon_ies_len;
2719           size_t proberesp_ies_len;
2720           size_t assocresp_ies_len;
2721           size_t probe_resp_len;
2722 };
2723 
2724 /**
2725  * struct csa_settings - Settings for channel switch command
2726  * @cs_count: Count in Beacon frames (TBTT) to perform the switch
2727  * @block_tx: 1 - block transmission for CSA period
2728  * @freq_params: Next channel frequency parameter
2729  * @beacon_csa: Beacon/probe resp/asooc resp info for CSA period
2730  * @beacon_after: Next beacon/probe resp/asooc resp info
2731  * @counter_offset_beacon: Offset to the count field in beacon's tail
2732  * @counter_offset_presp: Offset to the count field in probe resp.
2733  * @punct_bitmap - Preamble puncturing bitmap
2734  * @link_id: Link ID to determine the link for MLD; -1 for non-MLD
2735  * @ubpr: Unsolicited broadcast Probe Response frame data
2736  */
2737 struct csa_settings {
2738           u8 cs_count;
2739           u8 block_tx;
2740 
2741           struct hostapd_freq_params freq_params;
2742           struct beacon_data beacon_csa;
2743           struct beacon_data beacon_after;
2744 
2745           u16 counter_offset_beacon[2];
2746           u16 counter_offset_presp[2];
2747 
2748           u16 punct_bitmap;
2749           int link_id;
2750 
2751           struct unsol_bcast_probe_resp ubpr;
2752 };
2753 
2754 /**
2755  * struct cca_settings - Settings for color switch command
2756  * @cca_count: Count in Beacon frames (TBTT) to perform the switch
2757  * @cca_color: The new color that we are switching to
2758  * @beacon_cca: Beacon/Probe Response/(Re)Association Response frame info for
2759  * color switch period
2760  * @beacon_after: Next Beacon/Probe Response/(Re)Association Response frame info
2761  * @counter_offset_beacon: Offset to the count field in Beacon frame tail
2762  * @counter_offset_presp: Offset to the count field in Probe Response frame
2763  * @ubpr: Unsolicited broadcast Probe Response frame data
2764  * @link_id: If >= 0 indicates the link of the AP MLD to configure
2765  */
2766 struct cca_settings {
2767           u8 cca_count;
2768           u8 cca_color;
2769 
2770           struct beacon_data beacon_cca;
2771           struct beacon_data beacon_after;
2772 
2773           u16 counter_offset_beacon;
2774           u16 counter_offset_presp;
2775 
2776           struct unsol_bcast_probe_resp ubpr;
2777 
2778           int link_id;
2779 };
2780 
2781 /* TDLS peer capabilities for send_tdls_mgmt() */
2782 enum tdls_peer_capability {
2783           TDLS_PEER_HT = BIT(0),
2784           TDLS_PEER_VHT = BIT(1),
2785           TDLS_PEER_WMM = BIT(2),
2786           TDLS_PEER_HE = BIT(3),
2787 };
2788 
2789 /* valid info in the wmm_params struct */
2790 enum wmm_params_valid_info {
2791           WMM_PARAMS_UAPSD_QUEUES_INFO = BIT(0),
2792 };
2793 
2794 /**
2795  * struct wmm_params - WMM parameterss configured for this association
2796  * @info_bitmap: Bitmap of valid wmm_params info; indicates what fields
2797  *        of the struct contain valid information.
2798  * @uapsd_queues: Bitmap of ACs configured for uapsd (valid only if
2799  *        %WMM_PARAMS_UAPSD_QUEUES_INFO is set)
2800  */
2801 struct wmm_params {
2802           u8 info_bitmap;
2803           u8 uapsd_queues;
2804 };
2805 
2806 #ifdef CONFIG_MACSEC
2807 struct macsec_init_params {
2808           bool always_include_sci;
2809           bool use_es;
2810           bool use_scb;
2811 };
2812 #endif /* CONFIG_MACSEC */
2813 
2814 enum drv_br_port_attr {
2815           DRV_BR_PORT_ATTR_PROXYARP,
2816           DRV_BR_PORT_ATTR_HAIRPIN_MODE,
2817           DRV_BR_PORT_ATTR_MCAST2UCAST,
2818 };
2819 
2820 enum drv_br_net_param {
2821           DRV_BR_NET_PARAM_GARP_ACCEPT,
2822           DRV_BR_MULTICAST_SNOOPING,
2823 };
2824 
2825 struct drv_acs_params {
2826           /* Selected mode (HOSTAPD_MODE_*) */
2827           enum hostapd_hw_mode hw_mode;
2828 
2829           /* Indicates whether HT is enabled */
2830           int ht_enabled;
2831 
2832           /* Indicates whether HT40 is enabled */
2833           int ht40_enabled;
2834 
2835           /* Indicates whether VHT is enabled */
2836           int vht_enabled;
2837 
2838           /* Configured ACS channel width */
2839           u16 ch_width;
2840 
2841           /* ACS frequency list info */
2842           const int *freq_list;
2843 
2844           /* Indicates whether EDMG is enabled */
2845           int edmg_enabled;
2846 
2847           /* Indicates whether EHT is enabled */
2848           bool eht_enabled;
2849 
2850           /* Indicates the link if MLO case; -1 otherwise */
2851           int link_id;
2852 };
2853 
2854 struct wpa_bss_trans_info {
2855           u8 mbo_transition_reason;
2856           u8 n_candidates;
2857           u8 *bssid;
2858 };
2859 
2860 struct wpa_bss_candidate_info {
2861           u8 num;
2862           struct candidate_list {
2863                     u8 bssid[ETH_ALEN];
2864                     u8 is_accept;
2865                     u32 reject_reason;
2866           } *candidates;
2867 };
2868 
2869 struct wpa_pmkid_params {
2870           const u8 *bssid;
2871           const u8 *ssid;
2872           size_t ssid_len;
2873           const u8 *fils_cache_id;
2874           const u8 *pmkid;
2875           const u8 *pmk;
2876           size_t pmk_len;
2877           u32 pmk_lifetime;
2878           u8 pmk_reauth_threshold;
2879 };
2880 
2881 /* Mask used to specify which connection parameters have to be updated */
2882 enum wpa_drv_update_connect_params_mask {
2883           WPA_DRV_UPDATE_ASSOC_IES      = BIT(0),
2884           WPA_DRV_UPDATE_FILS_ERP_INFO  = BIT(1),
2885           WPA_DRV_UPDATE_AUTH_TYPE      = BIT(2),
2886 };
2887 
2888 /**
2889  * struct external_auth - External authentication trigger parameters
2890  *
2891  * These are used across the external authentication request and event
2892  * interfaces.
2893  * @action: Action type / trigger for external authentication. Only significant
2894  *        for the event interface.
2895  * @bssid: BSSID of the peer with which the authentication has to happen. Used
2896  *        by both the request and event interface.
2897  * @ssid: SSID of the AP. Used by both the request and event interface.
2898  * @ssid_len: SSID length in octets.
2899  * @key_mgmt_suite: AKM suite of the respective authentication. Optional for
2900  *        the request interface.
2901  * @status: Status code, %WLAN_STATUS_SUCCESS for successful authentication,
2902  *        use %WLAN_STATUS_UNSPECIFIED_FAILURE if wpa_supplicant cannot give
2903  *        the real status code for failures. Used only for the request interface
2904  *        from user space to the driver.
2905  * @pmkid: Generated PMKID as part of external auth exchange (e.g., SAE).
2906  * @mld_addr: AP's MLD address or %NULL if MLO is not used
2907  */
2908 struct external_auth {
2909           enum {
2910                     EXT_AUTH_START,
2911                     EXT_AUTH_ABORT,
2912           } action;
2913           const u8 *bssid;
2914           const u8 *ssid;
2915           size_t ssid_len;
2916           unsigned int key_mgmt_suite;
2917           u16 status;
2918           const u8 *pmkid;
2919           const u8 *mld_addr;
2920 };
2921 
2922 #define WPAS_MAX_PASN_PEERS 10
2923 
2924 enum pasn_status {
2925           PASN_STATUS_SUCCESS = 0,
2926           PASN_STATUS_FAILURE = 1,
2927 };
2928 
2929 /**
2930  * struct pasn_peer - PASN peer parameters
2931  *
2932  * Used to process the PASN authentication event from the driver to
2933  * userspace and to send a response back.
2934  * @own_addr: Own MAC address specified by the driver to use for PASN
2935  *        handshake.
2936  * @peer_addr: MAC address of the peer with which PASN authentication is to be
2937  *        performed.
2938  * @network_id: Unique id for the network.
2939  *        This identifier is used as a unique identifier for each network
2940  *        block when using the control interface. Each network is allocated an
2941  *        id when it is being created, either when reading the configuration
2942  *        file or when a new network is added through the control interface.
2943  * @akmp: Authentication key management protocol type supported.
2944  * @cipher: Cipher suite.
2945  * @group: Finite cyclic group. Default group used is 19 (ECC).
2946  * @ltf_keyseed_required: Indicates whether LTF keyseed generation is required
2947  * @status: PASN response status, %PASN_STATUS_SUCCESS for successful
2948  *        authentication, use %PASN_STATUS_FAILURE if PASN authentication
2949  *        fails or if wpa_supplicant fails to set the security ranging context to
2950  *        the driver
2951  */
2952 struct pasn_peer {
2953           u8 own_addr[ETH_ALEN];
2954           u8 peer_addr[ETH_ALEN];
2955           int network_id;
2956           int akmp;
2957           int cipher;
2958           int group;
2959           bool ltf_keyseed_required;
2960           enum pasn_status status;
2961 };
2962 
2963 /**
2964  * struct pasn_auth - PASN authentication trigger parameters
2965  *
2966  * These are used across the PASN authentication event from the driver to
2967  * userspace and to send a response to it.
2968  * @action: Action type. Only significant for the event interface.
2969  * @num_peers: The number of peers for which the PASN handshake is requested
2970  *        for.
2971  * @peer: Holds the peer details.
2972  */
2973 struct pasn_auth {
2974           enum {
2975                     PASN_ACTION_AUTH,
2976                     PASN_ACTION_DELETE_SECURE_RANGING_CONTEXT,
2977           } action;
2978           unsigned int num_peers;
2979           struct pasn_peer peer[WPAS_MAX_PASN_PEERS];
2980 };
2981 
2982 /**
2983  * struct secure_ranging_params - Parameters required to set secure ranging
2984  *        context for a peer.
2985  *
2986  * @action: Add or delete a security context to the driver.
2987  * @own_addr: Own MAC address used during key derivation.
2988  * @peer_addr: Address of the peer device.
2989  * @cipher: Cipher suite.
2990  * @tk_len: Length of temporal key.
2991  * @tk: Temporal key buffer.
2992  * @ltf_keyseed_len: Length of LTF keyseed.
2993  * @ltf_keyeed: LTF keyseed buffer.
2994  */
2995 struct secure_ranging_params {
2996           u32 action;
2997           const u8 *own_addr;
2998           const u8 *peer_addr;
2999           u32 cipher;
3000           u8 tk_len;
3001           const u8 *tk;
3002           u8 ltf_keyseed_len;
3003           const u8 *ltf_keyseed;
3004 };
3005 
3006 /* enum nested_attr - Used to specify if subcommand uses nested attributes */
3007 enum nested_attr {
3008           NESTED_ATTR_NOT_USED = 0,
3009           NESTED_ATTR_USED = 1,
3010           NESTED_ATTR_UNSPECIFIED = 2,
3011 };
3012 
3013 /* Preferred channel list information */
3014 
3015 /* GO role */
3016 #define WEIGHTED_PCL_GO BIT(0)
3017 /* P2P Client role */
3018 #define WEIGHTED_PCL_CLI BIT(1)
3019 /* Must be considered for operating channel */
3020 #define WEIGHTED_PCL_MUST_CONSIDER BIT(2)
3021 /* Should be excluded in GO negotiation */
3022 #define WEIGHTED_PCL_EXCLUDE BIT(3)
3023 
3024 /* Preferred channel list with weight */
3025 struct weighted_pcl {
3026           u32 freq; /* MHz */
3027           u8 weight;
3028           u32 flag; /* bitmap for WEIGHTED_PCL_* */
3029 };
3030 
3031 struct driver_sta_mlo_info {
3032           bool default_map;
3033           u16 req_links; /* bitmap of requested link IDs */
3034           u16 valid_links; /* bitmap of accepted link IDs */
3035           u8 assoc_link_id;
3036           u8 ap_mld_addr[ETH_ALEN];
3037           struct {
3038                     u8 addr[ETH_ALEN];
3039                     u8 bssid[ETH_ALEN];
3040                     unsigned int freq;
3041                     struct t2lm_mapping t2lmap;
3042           } links[MAX_NUM_MLD_LINKS];
3043 };
3044 
3045 /**
3046  * struct wpa_driver_ops - Driver interface API definition
3047  *
3048  * This structure defines the API that each driver interface needs to implement
3049  * for core wpa_supplicant code. All driver specific functionality is captured
3050  * in this wrapper.
3051  */
3052 struct wpa_driver_ops {
3053           /** Name of the driver interface */
3054           const char *name;
3055           /** One line description of the driver interface */
3056           const char *desc;
3057 
3058           /**
3059            * get_bssid - Get the current BSSID
3060            * @priv: private driver interface data
3061            * @bssid: buffer for BSSID (ETH_ALEN = 6 bytes)
3062            *
3063            * Returns: 0 on success, -1 on failure
3064            *
3065            * Query kernel driver for the current BSSID and copy it to bssid.
3066            * Setting bssid to 00:00:00:00:00:00 is recommended if the STA is not
3067            * associated.
3068            */
3069           int (*get_bssid)(void *priv, u8 *bssid);
3070 
3071           /**
3072            * get_ssid - Get the current SSID
3073            * @priv: private driver interface data
3074            * @ssid: buffer for SSID (at least 32 bytes)
3075            *
3076            * Returns: Length of the SSID on success, -1 on failure
3077            *
3078            * Query kernel driver for the current SSID and copy it to ssid.
3079            * Returning zero is recommended if the STA is not associated.
3080            *
3081            * Note: SSID is an array of octets, i.e., it is not nul terminated and
3082            * can, at least in theory, contain control characters (including nul)
3083            * and as such, should be processed as binary data, not a printable
3084            * string.
3085            */
3086           int (*get_ssid)(void *priv, u8 *ssid);
3087 
3088           /**
3089            * set_key - Configure encryption key
3090            * @priv: private driver interface data
3091            * @params: Key parameters
3092            * Returns: 0 on success, -1 on failure
3093            *
3094            * Configure the given key for the kernel driver. If the driver
3095            * supports separate individual keys (4 default keys + 1 individual),
3096            * addr can be used to determine whether the key is default or
3097            * individual. If only 4 keys are supported, the default key with key
3098            * index 0 is used as the individual key. STA must be configured to use
3099            * it as the default Tx key (set_tx is set) and accept Rx for all the
3100            * key indexes. In most cases, WPA uses only key indexes 1 and 2 for
3101            * broadcast keys, so key index 0 is available for this kind of
3102            * configuration.
3103            *
3104            * Please note that TKIP keys include separate TX and RX MIC keys and
3105            * some drivers may expect them in different order than wpa_supplicant
3106            * is using. If the TX/RX keys are swapped, all TKIP encrypted packets
3107            * will trigger Michael MIC errors. This can be fixed by changing the
3108            * order of MIC keys by swapping the bytes 16..23 and 24..31 of the key
3109            * in driver_*.c set_key() implementation, see driver_ndis.c for an
3110            * example on how this can be done.
3111            */
3112           int (*set_key)(void *priv, struct wpa_driver_set_key_params *params);
3113 
3114           /**
3115            * init - Initialize driver interface
3116            * @ctx: context to be used when calling wpa_supplicant functions,
3117            * e.g., wpa_supplicant_event()
3118            * @ifname: interface name, e.g., wlan0
3119            *
3120            * Returns: Pointer to private data, %NULL on failure
3121            *
3122            * Initialize driver interface, including event processing for kernel
3123            * driver events (e.g., associated, scan results, Michael MIC failure).
3124            * This function can allocate a private configuration data area for
3125            * @ctx, file descriptor, interface name, etc. information that may be
3126            * needed in future driver operations. If this is not used, non-NULL
3127            * value will need to be returned because %NULL is used to indicate
3128            * failure. The returned value will be used as 'void *priv' data for
3129            * all other driver_ops functions.
3130            *
3131            * The main event loop (eloop.c) of wpa_supplicant can be used to
3132            * register callback for read sockets (eloop_register_read_sock()).
3133            *
3134            * See below for more information about events and
3135            * wpa_supplicant_event() function.
3136            */
3137           void * (*init)(void *ctx, const char *ifname);
3138 
3139           /**
3140            * deinit - Deinitialize driver interface
3141            * @priv: private driver interface data from init()
3142            *
3143            * Shut down driver interface and processing of driver events. Free
3144            * private data buffer if one was allocated in init() handler.
3145            */
3146           void (*deinit)(void *priv);
3147 
3148           /**
3149            * set_param - Set driver configuration parameters
3150            * @priv: private driver interface data from init()
3151            * @param: driver specific configuration parameters
3152            *
3153            * Returns: 0 on success, -1 on failure
3154            *
3155            * Optional handler for notifying driver interface about configuration
3156            * parameters (driver_param).
3157            */
3158           int (*set_param)(void *priv, const char *param);
3159 
3160           /**
3161            * set_countermeasures - Enable/disable TKIP countermeasures
3162            * @priv: private driver interface data
3163            * @enabled: 1 = countermeasures enabled, 0 = disabled
3164            *
3165            * Returns: 0 on success, -1 on failure
3166            *
3167            * Configure TKIP countermeasures. When these are enabled, the driver
3168            * should drop all received and queued frames that are using TKIP.
3169            */
3170           int (*set_countermeasures)(void *priv, int enabled);
3171 
3172           /**
3173            * deauthenticate - Request driver to deauthenticate
3174            * @priv: private driver interface data
3175            * @addr: peer address (BSSID of the AP)
3176            * @reason_code: 16-bit reason code to be sent in the deauthentication
3177            *        frame
3178            *
3179            * Returns: 0 on success, -1 on failure
3180            */
3181           int (*deauthenticate)(void *priv, const u8 *addr, u16 reason_code);
3182 
3183           /**
3184            * associate - Request driver to associate
3185            * @priv: private driver interface data
3186            * @params: association parameters
3187            *
3188            * Returns: 0 on success, -1 on failure
3189            */
3190           int (*associate)(void *priv,
3191                                struct wpa_driver_associate_params *params);
3192 
3193           /**
3194            * add_pmkid - Add PMKSA cache entry to the driver
3195            * @priv: private driver interface data
3196            * @params: PMKSA parameters
3197            *
3198            * Returns: 0 on success, -1 on failure
3199            *
3200            * This function is called when a new PMK is received, as a result of
3201            * either normal authentication or RSN pre-authentication. The PMKSA
3202            * parameters are either a set of bssid, pmkid, and pmk; or a set of
3203            * ssid, fils_cache_id, pmkid, and pmk.
3204            *
3205            * If the driver generates RSN IE, i.e., it does not use wpa_ie in
3206            * associate(), add_pmkid() can be used to add new PMKSA cache entries
3207            * in the driver. If the driver uses wpa_ie from wpa_supplicant, this
3208            * driver_ops function does not need to be implemented. Likewise, if
3209            * the driver does not support WPA, this function is not needed.
3210            */
3211           int (*add_pmkid)(void *priv, struct wpa_pmkid_params *params);
3212 
3213           /**
3214            * remove_pmkid - Remove PMKSA cache entry to the driver
3215            * @priv: private driver interface data
3216            * @params: PMKSA parameters
3217            *
3218            * Returns: 0 on success, -1 on failure
3219            *
3220            * This function is called when the supplicant drops a PMKSA cache
3221            * entry for any reason. The PMKSA parameters are either a set of
3222            * bssid and pmkid; or a set of ssid, fils_cache_id, and pmkid.
3223            *
3224            * If the driver generates RSN IE, i.e., it does not use wpa_ie in
3225            * associate(), remove_pmkid() can be used to synchronize PMKSA caches
3226            * between the driver and wpa_supplicant. If the driver uses wpa_ie
3227            * from wpa_supplicant, this driver_ops function does not need to be
3228            * implemented. Likewise, if the driver does not support WPA, this
3229            * function is not needed.
3230            */
3231           int (*remove_pmkid)(void *priv, struct wpa_pmkid_params *params);
3232 
3233           /**
3234            * flush_pmkid - Flush PMKSA cache
3235            * @priv: private driver interface data
3236            *
3237            * Returns: 0 on success, -1 on failure
3238            *
3239            * This function is called when the supplicant drops all PMKSA cache
3240            * entries for any reason.
3241            *
3242            * If the driver generates RSN IE, i.e., it does not use wpa_ie in
3243            * associate(), remove_pmkid() can be used to synchronize PMKSA caches
3244            * between the driver and wpa_supplicant. If the driver uses wpa_ie
3245            * from wpa_supplicant, this driver_ops function does not need to be
3246            * implemented. Likewise, if the driver does not support WPA, this
3247            * function is not needed.
3248            */
3249           int (*flush_pmkid)(void *priv);
3250 
3251           /**
3252            * get_capa - Get driver capabilities
3253            * @priv: private driver interface data
3254            *
3255            * Returns: 0 on success, -1 on failure
3256            *
3257            * Get driver/firmware/hardware capabilities.
3258            */
3259           int (*get_capa)(void *priv, struct wpa_driver_capa *capa);
3260 
3261           /**
3262            * poll - Poll driver for association information
3263            * @priv: private driver interface data
3264            *
3265            * This is an optional callback that can be used when the driver does
3266            * not provide event mechanism for association events. This is called
3267            * when receiving WPA/RSN EAPOL-Key messages that require association
3268            * information. The driver interface is supposed to generate associnfo
3269            * event before returning from this callback function. In addition, the
3270            * driver interface should generate an association event after having
3271            * sent out associnfo.
3272            */
3273           void (*poll)(void *priv);
3274 
3275           /**
3276            * get_ifindex - Get interface index
3277            * @priv: private driver interface data
3278            *
3279            * Returns: Interface index
3280            */
3281           unsigned int (*get_ifindex)(void *priv);
3282 
3283           /**
3284            * get_ifname - Get interface name
3285            * @priv: private driver interface data
3286            *
3287            * Returns: Pointer to the interface name. This can differ from the
3288            * interface name used in init() call. Init() is called first.
3289            *
3290            * This optional function can be used to allow the driver interface to
3291            * replace the interface name with something else, e.g., based on an
3292            * interface mapping from a more descriptive name.
3293            */
3294           const char * (*get_ifname)(void *priv);
3295 
3296           /**
3297            * get_mac_addr - Get own MAC address
3298            * @priv: private driver interface data
3299            *
3300            * Returns: Pointer to own MAC address or %NULL on failure
3301            *
3302            * This optional function can be used to get the own MAC address of the
3303            * device from the driver interface code. This is only needed if the
3304            * l2_packet implementation for the OS does not provide easy access to
3305            * a MAC address. */
3306           const u8 * (*get_mac_addr)(void *priv);
3307 
3308           /**
3309            * set_operstate - Sets device operating state to DORMANT or UP
3310            * @priv: private driver interface data
3311            * @state: 0 = dormant, 1 = up
3312            * Returns: 0 on success, -1 on failure
3313            *
3314            * This is an optional function that can be used on operating systems
3315            * that support a concept of controlling network device state from user
3316            * space applications. This function, if set, gets called with
3317            * state = 1 when authentication has been completed and with state = 0
3318            * when connection is lost.
3319            */
3320           int (*set_operstate)(void *priv, int state);
3321 
3322           /**
3323            * mlme_setprotection - MLME-SETPROTECTION.request primitive
3324            * @priv: Private driver interface data
3325            * @addr: Address of the station for which to set protection (may be
3326            * %NULL for group keys)
3327            * @protect_type: MLME_SETPROTECTION_PROTECT_TYPE_*
3328            * @key_type: MLME_SETPROTECTION_KEY_TYPE_*
3329            * Returns: 0 on success, -1 on failure
3330            *
3331            * This is an optional function that can be used to set the driver to
3332            * require protection for Tx and/or Rx frames. This uses the layer
3333            * interface defined in IEEE 802.11i-2004 clause 10.3.22.1
3334            * (MLME-SETPROTECTION.request). Many drivers do not use explicit
3335            * set protection operation; instead, they set protection implicitly
3336            * based on configured keys.
3337            */
3338           int (*mlme_setprotection)(void *priv, const u8 *addr, int protect_type,
3339                                           int key_type);
3340 
3341           /**
3342            * get_hw_feature_data - Get hardware support data (channels and rates)
3343            * @priv: Private driver interface data
3344            * @num_modes: Variable for returning the number of returned modes
3345            * flags: Variable for returning hardware feature flags
3346            * @dfs: Variable for returning DFS region (HOSTAPD_DFS_REGION_*)
3347            * Returns: Pointer to allocated hardware data on success or %NULL on
3348            * failure. Caller is responsible for freeing this.
3349            */
3350           struct hostapd_hw_modes * (*get_hw_feature_data)(void *priv,
3351                                                                        u16 *num_modes,
3352                                                                        u16 *flags, u8 *dfs);
3353 
3354           /**
3355            * send_mlme - Send management frame from MLME
3356            * @priv: Private driver interface data
3357            * @data: IEEE 802.11 management frame with IEEE 802.11 header
3358            * @data_len: Size of the management frame
3359            * @noack: Do not wait for this frame to be acked (disable retries)
3360            * @freq: Frequency (in MHz) to send the frame on, or 0 to let the
3361            * driver decide
3362            * @csa_offs: Array of CSA offsets or %NULL
3363            * @csa_offs_len: Number of elements in csa_offs
3364            * @no_encrypt: Do not encrypt frame even if appropriate key exists
3365            *        (used only for testing purposes)
3366            * @wait: Time to wait off-channel for a response (in ms), or zero
3367            * @link_id: Link ID to use for TX, or -1 if not set
3368            * Returns: 0 on success, -1 on failure
3369            */
3370           int (*send_mlme)(void *priv, const u8 *data, size_t data_len,
3371                                int noack, unsigned int freq, const u16 *csa_offs,
3372                                size_t csa_offs_len, int no_encrypt,
3373                                unsigned int wait, int link_id);
3374 
3375           /**
3376            * update_ft_ies - Update FT (IEEE 802.11r) IEs
3377            * @priv: Private driver interface data
3378            * @md: Mobility domain (2 octets) (also included inside ies)
3379            * @ies: FT IEs (MDIE, FTIE, ...) or %NULL to remove IEs
3380            * @ies_len: Length of FT IEs in bytes
3381            * Returns: 0 on success, -1 on failure
3382            *
3383            * The supplicant uses this callback to let the driver know that keying
3384            * material for FT is available and that the driver can use the
3385            * provided IEs in the next message in FT authentication sequence.
3386            *
3387            * This function is only needed for driver that support IEEE 802.11r
3388            * (Fast BSS Transition).
3389            */
3390           int (*update_ft_ies)(void *priv, const u8 *md, const u8 *ies,
3391                                    size_t ies_len);
3392 
3393           /**
3394            * get_scan_results - Fetch the latest scan results
3395            * @priv: Private driver interface data
3396            * @bssid: Return results only for the specified BSSID, %NULL for all
3397            *
3398            * Returns: Allocated buffer of scan results (caller is responsible for
3399            * freeing the data structure) on success, NULL on failure
3400            */
3401           struct wpa_scan_results * (*get_scan_results)(void *priv,
3402                                                                   const u8 *bssid);
3403 
3404           /**
3405            * get_scan_results2 - Fetch the latest scan results
3406            * @priv: private driver interface data
3407            *
3408            * Returns: Allocated buffer of scan results (caller is responsible for
3409            * freeing the data structure) on success, NULL on failure
3410            */
3411            struct wpa_scan_results * (*get_scan_results2)(void *priv);
3412 
3413           /**
3414            * set_country - Set country
3415            * @priv: Private driver interface data
3416            * @alpha2: country to which to switch to
3417            * Returns: 0 on success, -1 on failure
3418            *
3419            * This function is for drivers which support some form
3420            * of setting a regulatory domain.
3421            */
3422           int (*set_country)(void *priv, const char *alpha2);
3423 
3424           /**
3425            * get_country - Get country
3426            * @priv: Private driver interface data
3427            * @alpha2: Buffer for returning country code (at least 3 octets)
3428            * Returns: 0 on success, -1 on failure
3429            */
3430           int (*get_country)(void *priv, char *alpha2);
3431 
3432           /**
3433            * global_init - Global driver initialization
3434            * @ctx: wpa_global pointer
3435            * Returns: Pointer to private data (global), %NULL on failure
3436            *
3437            * This optional function is called to initialize the driver wrapper
3438            * for global data, i.e., data that applies to all interfaces. If this
3439            * function is implemented, global_deinit() will also need to be
3440            * implemented to free the private data. The driver will also likely
3441            * use init2() function instead of init() to get the pointer to global
3442            * data available to per-interface initializer.
3443            */
3444           void * (*global_init)(void *ctx);
3445 
3446           /**
3447            * global_deinit - Global driver deinitialization
3448            * @priv: private driver global data from global_init()
3449            *
3450            * Terminate any global driver related functionality and free the
3451            * global data structure.
3452            */
3453           void (*global_deinit)(void *priv);
3454 
3455           /**
3456            * init2 - Initialize driver interface (with global data)
3457            * @ctx: context to be used when calling wpa_supplicant functions,
3458            * e.g., wpa_supplicant_event()
3459            * @ifname: interface name, e.g., wlan0
3460            * @global_priv: private driver global data from global_init()
3461            * Returns: Pointer to private data, %NULL on failure
3462            *
3463            * This function can be used instead of init() if the driver wrapper
3464            * uses global data.
3465            */
3466           void * (*init2)(void *ctx, const char *ifname, void *global_priv);
3467 
3468           /**
3469            * get_interfaces - Get information about available interfaces
3470            * @global_priv: private driver global data from global_init()
3471            * Returns: Allocated buffer of interface information (caller is
3472            * responsible for freeing the data structure) on success, NULL on
3473            * failure
3474            */
3475           struct wpa_interface_info * (*get_interfaces)(void *global_priv);
3476 
3477           /**
3478            * scan2 - Request the driver to initiate scan
3479            * @priv: private driver interface data
3480            * @params: Scan parameters
3481            *
3482            * Returns: 0 on success, -1 on failure
3483            *
3484            * Once the scan results are ready, the driver should report scan
3485            * results event for wpa_supplicant which will eventually request the
3486            * results with wpa_driver_get_scan_results2().
3487            */
3488           int (*scan2)(void *priv, struct wpa_driver_scan_params *params);
3489 
3490           /**
3491            * authenticate - Request driver to authenticate
3492            * @priv: private driver interface data
3493            * @params: authentication parameters
3494            * Returns: 0 on success, -1 on failure
3495            *
3496            * This is an optional function that can be used with drivers that
3497            * support separate authentication and association steps, i.e., when
3498            * wpa_supplicant can act as the SME. If not implemented, associate()
3499            * function is expected to take care of IEEE 802.11 authentication,
3500            * too.
3501            */
3502           int (*authenticate)(void *priv,
3503                                   struct wpa_driver_auth_params *params);
3504 
3505           /**
3506            * set_ap - Set Beacon and Probe Response information for AP mode
3507            * @priv: Private driver interface data
3508            * @params: Parameters to use in AP mode
3509            *
3510            * This function is used to configure Beacon template and/or extra IEs
3511            * to add for Beacon and Probe Response frames for the driver in
3512            * AP mode. The driver is responsible for building the full Beacon
3513            * frame by concatenating the head part with TIM IE generated by the
3514            * driver/firmware and finishing with the tail part. Depending on the
3515            * driver architectue, this can be done either by using the full
3516            * template or the set of additional IEs (e.g., WPS and P2P IE).
3517            * Similarly, Probe Response processing depends on the driver design.
3518            * If the driver (or firmware) takes care of replying to Probe Request
3519            * frames, the extra IEs provided here needs to be added to the Probe
3520            * Response frames.
3521            *
3522            * Returns: 0 on success, -1 on failure
3523            */
3524           int (*set_ap)(void *priv, struct wpa_driver_ap_params *params);
3525 
3526           /**
3527            * set_acl - Set ACL in AP mode
3528            * @priv: Private driver interface data
3529            * @params: Parameters to configure ACL
3530            * Returns: 0 on success, -1 on failure
3531            *
3532            * This is used only for the drivers which support MAC address ACL.
3533            */
3534           int (*set_acl)(void *priv, struct hostapd_acl_params *params);
3535 
3536           /**
3537            * hapd_init - Initialize driver interface (hostapd only)
3538            * @hapd: Pointer to hostapd context
3539            * @params: Configuration for the driver wrapper
3540            * Returns: Pointer to private data, %NULL on failure
3541            *
3542            * This function is used instead of init() or init2() when the driver
3543            * wrapper is used with hostapd.
3544            */
3545           void * (*hapd_init)(struct hostapd_data *hapd,
3546                                   struct wpa_init_params *params);
3547 
3548           /**
3549            * hapd_deinit - Deinitialize driver interface (hostapd only)
3550            * @priv: Private driver interface data from hapd_init()
3551            */
3552           void (*hapd_deinit)(void *priv);
3553 
3554           /**
3555            * set_ieee8021x - Enable/disable IEEE 802.1X support (AP only)
3556            * @priv: Private driver interface data
3557            * @params: BSS parameters
3558            * Returns: 0 on success, -1 on failure
3559            *
3560            * This is an optional function to configure the kernel driver to
3561            * enable/disable IEEE 802.1X support and set WPA/WPA2 parameters. This
3562            * can be left undefined (set to %NULL) if IEEE 802.1X support is
3563            * always enabled and the driver uses set_ap() to set WPA/RSN IE
3564            * for Beacon frames.
3565            *
3566            * DEPRECATED - use set_ap() instead
3567            */
3568           int (*set_ieee8021x)(void *priv, struct wpa_bss_params *params);
3569 
3570           /**
3571            * set_privacy - Enable/disable privacy (AP only)
3572            * @priv: Private driver interface data
3573            * @enabled: 1 = privacy enabled, 0 = disabled
3574            * Returns: 0 on success, -1 on failure
3575            *
3576            * This is an optional function to configure privacy field in the
3577            * kernel driver for Beacon frames. This can be left undefined (set to
3578            * %NULL) if the driver uses the Beacon template from set_ap().
3579            *
3580            * DEPRECATED - use set_ap() instead
3581            */
3582           int (*set_privacy)(void *priv, int enabled);
3583 
3584           /**
3585            * get_seqnum - Fetch the current TSC/packet number (AP only)
3586            * @ifname: The interface name (main or virtual)
3587            * @priv: Private driver interface data
3588            * @addr: MAC address of the station or %NULL for group keys
3589            * @idx: Key index
3590            * @link_id: Link ID for a group key, or -1 if not set
3591            * @seq: Buffer for returning the latest used TSC/packet number
3592            * Returns: 0 on success, -1 on failure
3593            *
3594            * This function is used to fetch the last used TSC/packet number for
3595            * a TKIP, CCMP, GCMP, or BIP/IGTK key. It is mainly used with group
3596            * keys, so there is no strict requirement on implementing support for
3597            * unicast keys (i.e., addr != %NULL).
3598            */
3599           int (*get_seqnum)(const char *ifname, void *priv, const u8 *addr,
3600                                 int idx, int link_id, u8 *seq);
3601 
3602           /**
3603            * flush - Flush all association stations (AP only)
3604            * @priv: Private driver interface data
3605            * @link_id: In case of MLO, valid link ID on which all associated
3606            *        stations will be flushed, -1 otherwise.
3607            * Returns: 0 on success, -1 on failure
3608            *
3609            * This function requests the driver to disassociate all associated
3610            * stations. This function does not need to be implemented if the
3611            * driver does not process association frames internally.
3612            */
3613           int (*flush)(void *priv, int link_id);
3614 
3615           /**
3616            * set_generic_elem - Add IEs into Beacon/Probe Response frames (AP)
3617            * @priv: Private driver interface data
3618            * @elem: Information elements
3619            * @elem_len: Length of the elem buffer in octets
3620            * Returns: 0 on success, -1 on failure
3621            *
3622            * This is an optional function to add information elements in the
3623            * kernel driver for Beacon and Probe Response frames. This can be left
3624            * undefined (set to %NULL) if the driver uses the Beacon template from
3625            * set_ap().
3626            *
3627            * DEPRECATED - use set_ap() instead
3628            */
3629           int (*set_generic_elem)(void *priv, const u8 *elem, size_t elem_len);
3630 
3631           /**
3632            * read_sta_data - Fetch station data
3633            * @priv: Private driver interface data
3634            * @data: Buffer for returning station information
3635            * @addr: MAC address of the station
3636            * Returns: 0 on success, -1 on failure
3637            */
3638           int (*read_sta_data)(void *priv, struct hostap_sta_driver_data *data,
3639                                    const u8 *addr);
3640 
3641           /**
3642            * tx_control_port - Send a frame over the 802.1X controlled port
3643            * @priv: Private driver interface data
3644            * @dest: Destination MAC address
3645            * @proto: Ethertype in host byte order
3646            * @buf: Frame payload starting from IEEE 802.1X header
3647            * @len: Frame payload length
3648            * @no_encrypt: Do not encrypt frame
3649            * @link_id: Link ID to use for TX, or -1 if not set
3650            *
3651            * Returns 0 on success, else an error
3652            *
3653            * This is like a normal Ethernet send except that the driver is aware
3654            * (by other means than the Ethertype) that this frame is special,
3655            * and more importantly it gains an ordering between the transmission of
3656            * the frame and other driver management operations such as key
3657            * installations. This can be used to work around known limitations in
3658            * IEEE 802.11 protocols such as race conditions between rekeying 4-way
3659            * handshake message 4/4 and a PTK being overwritten.
3660            *
3661            * This function is only used for a given interface if the driver
3662            * instance reports WPA_DRIVER_FLAGS_CONTROL_PORT capability. Otherwise,
3663            * API users will fall back to sending the frame via a normal socket.
3664            */
3665           int (*tx_control_port)(void *priv, const u8 *dest,
3666                                      u16 proto, const u8 *buf, size_t len,
3667                                      int no_encrypt, int link_id);
3668 
3669           /**
3670            * hapd_send_eapol - Send an EAPOL packet (AP only)
3671            * @priv: private driver interface data
3672            * @addr: Destination MAC address
3673            * @data: EAPOL packet starting with IEEE 802.1X header
3674            * @data_len: Length of the EAPOL packet in octets
3675            * @encrypt: Whether the frame should be encrypted
3676            * @own_addr: Source MAC address
3677            * @flags: WPA_STA_* flags for the destination station
3678            * @link_id: Link ID to use for TX, or -1 if not set
3679            *
3680            * Returns: 0 on success, -1 on failure
3681            */
3682           int (*hapd_send_eapol)(void *priv, const u8 *addr, const u8 *data,
3683                                      size_t data_len, int encrypt,
3684                                      const u8 *own_addr, u32 flags, int link_id);
3685 
3686           /**
3687            * sta_deauth - Deauthenticate a station (AP only)
3688            * @priv: Private driver interface data
3689            * @own_addr: Source address and BSSID for the Deauthentication frame
3690            * @addr: MAC address of the station to deauthenticate
3691            * @reason: Reason code for the Deauthentication frame
3692            * @link_id: Link ID to use for Deauthentication frame, or -1 if not set
3693            * Returns: 0 on success, -1 on failure
3694            *
3695            * This function requests a specific station to be deauthenticated and
3696            * a Deauthentication frame to be sent to it.
3697            */
3698           int (*sta_deauth)(void *priv, const u8 *own_addr, const u8 *addr,
3699                                 u16 reason, int link_id);
3700 
3701           /**
3702            * sta_disassoc - Disassociate a station (AP only)
3703            * @priv: Private driver interface data
3704            * @own_addr: Source address and BSSID for the Disassociation frame
3705            * @addr: MAC address of the station to disassociate
3706            * @reason: Reason code for the Disassociation frame
3707            * Returns: 0 on success, -1 on failure
3708            *
3709            * This function requests a specific station to be disassociated and
3710            * a Disassociation frame to be sent to it.
3711            */
3712           int (*sta_disassoc)(void *priv, const u8 *own_addr, const u8 *addr,
3713                                   u16 reason);
3714 
3715           /**
3716            * sta_remove - Remove a station entry (AP only)
3717            * @priv: Private driver interface data
3718            * @addr: MAC address of the station to be removed
3719            * Returns: 0 on success, -1 on failure
3720            */
3721           int (*sta_remove)(void *priv, const u8 *addr);
3722 
3723           /**
3724            * hapd_get_ssid - Get the current SSID (AP only)
3725            * @priv: Private driver interface data
3726            * @buf: Buffer for returning the SSID
3727            * @len: Maximum length of the buffer
3728            * Returns: Length of the SSID on success, -1 on failure
3729            *
3730            * This function need not be implemented if the driver uses Beacon
3731            * template from set_ap() and does not reply to Probe Request frames.
3732            */
3733           int (*hapd_get_ssid)(void *priv, u8 *buf, int len);
3734 
3735           /**
3736            * hapd_set_ssid - Set SSID (AP only)
3737            * @priv: Private driver interface data
3738            * @buf: SSID
3739            * @len: Length of the SSID in octets
3740            * Returns: 0 on success, -1 on failure
3741            *
3742            * DEPRECATED - use set_ap() instead
3743            */
3744           int (*hapd_set_ssid)(void *priv, const u8 *buf, int len);
3745 
3746           /**
3747            * hapd_set_countermeasures - Enable/disable TKIP countermeasures (AP)
3748            * @priv: Private driver interface data
3749            * @enabled: 1 = countermeasures enabled, 0 = disabled
3750            * Returns: 0 on success, -1 on failure
3751            *
3752            * This need not be implemented if the driver does not take care of
3753            * association processing.
3754            */
3755           int (*hapd_set_countermeasures)(void *priv, int enabled);
3756 
3757           /**
3758            * sta_add - Add a station entry
3759            * @priv: Private driver interface data
3760            * @params: Station parameters
3761            * Returns: 0 on success, -1 on failure
3762            *
3763            * This function is used to add or set (params->set 1) a station
3764            * entry in the driver. Adding STA entries is used only if the driver
3765            * does not take care of association processing.
3766            *
3767            * With drivers that don't support full AP client state, this function
3768            * is used to add a station entry to the driver once the station has
3769            * completed association.
3770            *
3771            * With TDLS, this function is used to add or set (params->set 1)
3772            * TDLS peer entries (even with drivers that do not support full AP
3773            * client state).
3774            */
3775           int (*sta_add)(void *priv, struct hostapd_sta_add_params *params);
3776 
3777           /**
3778            * get_inact_sec - Get station inactivity duration (AP only)
3779            * @priv: Private driver interface data
3780            * @addr: Station address
3781            * Returns: Number of seconds station has been inactive, -1 on failure
3782            */
3783           int (*get_inact_sec)(void *priv, const u8 *addr);
3784 
3785           /**
3786            * sta_clear_stats - Clear station statistics (AP only)
3787            * @priv: Private driver interface data
3788            * @addr: Station address
3789            * Returns: 0 on success, -1 on failure
3790            */
3791           int (*sta_clear_stats)(void *priv, const u8 *addr);
3792 
3793           /**
3794            * set_freq - Set channel/frequency (AP only)
3795            * @priv: Private driver interface data
3796            * @freq: Channel parameters
3797            * Returns: 0 on success, -1 on failure
3798            */
3799           int (*set_freq)(void *priv, struct hostapd_freq_params *freq);
3800 
3801           /**
3802            * set_rts - Set RTS threshold
3803            * @priv: Private driver interface data
3804            * @rts: RTS threshold in octets
3805            * Returns: 0 on success, -1 on failure
3806            */
3807           int (*set_rts)(void *priv, int rts);
3808 
3809           /**
3810            * set_frag - Set fragmentation threshold
3811            * @priv: Private driver interface data
3812            * @frag: Fragmentation threshold in octets
3813            * Returns: 0 on success, -1 on failure
3814            */
3815           int (*set_frag)(void *priv, int frag);
3816 
3817           /**
3818            * sta_set_flags - Set station flags (AP only)
3819            * @priv: Private driver interface data
3820            * @addr: Station address
3821            * @total_flags: Bitmap of all WPA_STA_* flags currently set
3822            * @flags_or: Bitmap of WPA_STA_* flags to add
3823            * @flags_and: Bitmap of WPA_STA_* flags to us as a mask
3824            * Returns: 0 on success, -1 on failure
3825            */
3826           int (*sta_set_flags)(void *priv, const u8 *addr,
3827                                    unsigned int total_flags, unsigned int flags_or,
3828                                    unsigned int flags_and);
3829 
3830           /**
3831            * sta_set_airtime_weight - Set station airtime weight (AP only)
3832            * @priv: Private driver interface data
3833            * @addr: Station address
3834            * @weight: New weight for station airtime assignment
3835            * Returns: 0 on success, -1 on failure
3836            */
3837           int (*sta_set_airtime_weight)(void *priv, const u8 *addr,
3838                                               unsigned int weight);
3839 
3840           /**
3841            * set_tx_queue_params - Set TX queue parameters
3842            * @priv: Private driver interface data
3843            * @queue: Queue number (0 = VO, 1 = VI, 2 = BE, 3 = BK)
3844            * @aifs: AIFS
3845            * @cw_min: cwMin
3846            * @cw_max: cwMax
3847            * @burst_time: Maximum length for bursting in 0.1 msec units
3848            * @link_id: Link ID to use, or -1 for non MLD.
3849            */
3850           int (*set_tx_queue_params)(void *priv, int queue, int aifs, int cw_min,
3851                                            int cw_max, int burst_time, int link_id);
3852 
3853           /**
3854            * if_add - Add a virtual interface
3855            * @priv: Private driver interface data
3856            * @type: Interface type
3857            * @ifname: Interface name for the new virtual interface
3858            * @addr: Local address to use for the interface or %NULL to use the
3859            *        parent interface address
3860            * @bss_ctx: BSS context for %WPA_IF_AP_BSS interfaces
3861            * @drv_priv: Pointer for overwriting the driver context or %NULL if
3862            *        not allowed (applies only to %WPA_IF_AP_BSS type)
3863            * @force_ifname: Buffer for returning an interface name that the
3864            *        driver ended up using if it differs from the requested ifname
3865            * @if_addr: Buffer for returning the allocated interface address
3866            *        (this may differ from the requested addr if the driver cannot
3867            *        change interface address)
3868            * @bridge: Bridge interface to use or %NULL if no bridge configured
3869            * @use_existing: Whether to allow existing interface to be used
3870            * @setup_ap: Whether to setup AP for %WPA_IF_AP_BSS interfaces
3871            * Returns: 0 on success, -1 on failure
3872            */
3873           int (*if_add)(void *priv, enum wpa_driver_if_type type,
3874                           const char *ifname, const u8 *addr, void *bss_ctx,
3875                           void **drv_priv, char *force_ifname, u8 *if_addr,
3876                           const char *bridge, int use_existing, int setup_ap);
3877 
3878           /**
3879            * if_remove - Remove a virtual interface
3880            * @priv: Private driver interface data
3881            * @type: Interface type
3882            * @ifname: Interface name of the virtual interface to be removed
3883            * Returns: 0 on success, -1 on failure
3884            */
3885           int (*if_remove)(void *priv, enum wpa_driver_if_type type,
3886                                const char *ifname);
3887 
3888           /**
3889            * set_sta_vlan - Bind a station into a specific interface (AP only)
3890            * @priv: Private driver interface data
3891            * @ifname: Interface (main or virtual BSS or VLAN)
3892            * @addr: MAC address of the associated station
3893            * @vlan_id: VLAN ID
3894            * @link_id: The link ID or -1 for non-MLO
3895            * Returns: 0 on success, -1 on failure
3896            *
3897            * This function is used to bind a station to a specific virtual
3898            * interface. It is only used if when virtual interfaces are supported,
3899            * e.g., to assign stations to different VLAN interfaces based on
3900            * information from a RADIUS server. This allows separate broadcast
3901            * domains to be used with a single BSS.
3902            */
3903           int (*set_sta_vlan)(void *priv, const u8 *addr, const char *ifname,
3904                                   int vlan_id, int link_id);
3905 
3906           /**
3907            * commit - Optional commit changes handler (AP only)
3908            * @priv: driver private data
3909            * Returns: 0 on success, -1 on failure
3910            *
3911            * This optional handler function can be registered if the driver
3912            * interface implementation needs to commit changes (e.g., by setting
3913            * network interface up) at the end of initial configuration. If set,
3914            * this handler will be called after initial setup has been completed.
3915            */
3916           int (*commit)(void *priv);
3917 
3918           /**
3919            * set_radius_acl_auth - Notification of RADIUS ACL change
3920            * @priv: Private driver interface data
3921            * @mac: MAC address of the station
3922            * @accepted: Whether the station was accepted
3923            * @session_timeout: Session timeout for the station
3924            * Returns: 0 on success, -1 on failure
3925            */
3926           int (*set_radius_acl_auth)(void *priv, const u8 *mac, int accepted,
3927                                            u32 session_timeout);
3928 
3929           /**
3930            * set_radius_acl_expire - Notification of RADIUS ACL expiration
3931            * @priv: Private driver interface data
3932            * @mac: MAC address of the station
3933            * Returns: 0 on success, -1 on failure
3934            */
3935           int (*set_radius_acl_expire)(void *priv, const u8 *mac);
3936 
3937           /**
3938            * set_ap_wps_ie - Add WPS IE(s) into Beacon/Probe Response frames (AP)
3939            * @priv: Private driver interface data
3940            * @beacon: WPS IE(s) for Beacon frames or %NULL to remove extra IE(s)
3941            * @proberesp: WPS IE(s) for Probe Response frames or %NULL to remove
3942            *        extra IE(s)
3943            * @assocresp: WPS IE(s) for (Re)Association Response frames or %NULL
3944            *        to remove extra IE(s)
3945            * Returns: 0 on success, -1 on failure
3946            *
3947            * This is an optional function to add WPS IE in the kernel driver for
3948            * Beacon and Probe Response frames. This can be left undefined (set
3949            * to %NULL) if the driver uses the Beacon template from set_ap()
3950            * and does not process Probe Request frames. If the driver takes care
3951            * of (Re)Association frame processing, the assocresp buffer includes
3952            * WPS IE(s) that need to be added to (Re)Association Response frames
3953            * whenever a (Re)Association Request frame indicated use of WPS.
3954            *
3955            * This will also be used to add P2P IE(s) into Beacon/Probe Response
3956            * frames when operating as a GO. The driver is responsible for adding
3957            * timing related attributes (e.g., NoA) in addition to the IEs
3958            * included here by appending them after these buffers. This call is
3959            * also used to provide Probe Response IEs for P2P Listen state
3960            * operations for drivers that generate the Probe Response frames
3961            * internally.
3962            *
3963            * DEPRECATED - use set_ap() instead
3964            */
3965           int (*set_ap_wps_ie)(void *priv, const struct wpabuf *beacon,
3966                                    const struct wpabuf *proberesp,
3967                                    const struct wpabuf *assocresp);
3968 
3969           /**
3970            * set_supp_port - Set IEEE 802.1X Supplicant Port status
3971            * @priv: Private driver interface data
3972            * @authorized: Whether the port is authorized
3973            * Returns: 0 on success, -1 on failure
3974            */
3975           int (*set_supp_port)(void *priv, int authorized);
3976 
3977           /**
3978            * set_wds_sta - Bind a station into a 4-address WDS (AP only)
3979            * @priv: Private driver interface data
3980            * @addr: MAC address of the associated station
3981            * @aid: Association ID
3982            * @val: 1 = bind to 4-address WDS; 0 = unbind
3983            * @bridge_ifname: Bridge interface to use for the WDS station or %NULL
3984            *        to indicate that bridge is not to be used
3985            * @ifname_wds: Buffer to return the interface name for the new WDS
3986            *        station or %NULL to indicate name is not returned.
3987            * Returns: 0 on success, -1 on failure
3988            */
3989           int (*set_wds_sta)(void *priv, const u8 *addr, int aid, int val,
3990                                  const char *bridge_ifname, char *ifname_wds);
3991 
3992           /**
3993            * send_action - Transmit an Action frame
3994            * @priv: Private driver interface data
3995            * @freq: Frequency (in MHz) of the channel
3996            * @wait: Time to wait off-channel for a response (in ms), or zero
3997            * @dst: Destination MAC address (Address 1)
3998            * @src: Source MAC address (Address 2)
3999            * @bssid: BSSID (Address 3)
4000            * @data: Frame body
4001            * @data_len: data length in octets
4002            @ @no_cck: Whether CCK rates must not be used to transmit this frame
4003            * Returns: 0 on success, -1 on failure
4004            *
4005            * This command can be used to request the driver to transmit an action
4006            * frame to the specified destination.
4007            *
4008            * If the %WPA_DRIVER_FLAGS_OFFCHANNEL_TX flag is set, the frame will
4009            * be transmitted on the given channel and the device will wait for a
4010            * response on that channel for the given wait time.
4011            *
4012            * If the flag is not set, the wait time will be ignored. In this case,
4013            * if a remain-on-channel duration is in progress, the frame must be
4014            * transmitted on that channel; alternatively the frame may be sent on
4015            * the current operational channel (if in associated state in station
4016            * mode or while operating as an AP.)
4017            *
4018            * If @src differs from the device MAC address, use of a random
4019            * transmitter address is requested for this message exchange.
4020            */
4021           int (*send_action)(void *priv, unsigned int freq, unsigned int wait,
4022                                  const u8 *dst, const u8 *src, const u8 *bssid,
4023                                  const u8 *data, size_t data_len, int no_cck);
4024 
4025           /**
4026            * send_action_cancel_wait - Cancel action frame TX wait
4027            * @priv: Private driver interface data
4028            *
4029            * This command cancels the wait time associated with sending an action
4030            * frame. It is only available when %WPA_DRIVER_FLAGS_OFFCHANNEL_TX is
4031            * set in the driver flags.
4032            */
4033           void (*send_action_cancel_wait)(void *priv);
4034 
4035           /**
4036            * remain_on_channel - Remain awake on a channel
4037            * @priv: Private driver interface data
4038            * @freq: Frequency (in MHz) of the channel
4039            * @duration: Duration in milliseconds
4040            * Returns: 0 on success, -1 on failure
4041            *
4042            * This command is used to request the driver to remain awake on the
4043            * specified channel for the specified duration and report received
4044            * Action frames with EVENT_RX_MGMT events. Optionally, received
4045            * Probe Request frames may also be requested to be reported by calling
4046            * probe_req_report(). These will be reported with EVENT_RX_PROBE_REQ.
4047            *
4048            * The driver may not be at the requested channel when this function
4049            * returns, i.e., the return code is only indicating whether the
4050            * request was accepted. The caller will need to wait until the
4051            * EVENT_REMAIN_ON_CHANNEL event indicates that the driver has
4052            * completed the channel change. This may take some time due to other
4053            * need for the radio and the caller should be prepared to timing out
4054            * its wait since there are no guarantees on when this request can be
4055            * executed.
4056            */
4057           int (*remain_on_channel)(void *priv, unsigned int freq,
4058                                          unsigned int duration);
4059 
4060           /**
4061            * cancel_remain_on_channel - Cancel remain-on-channel operation
4062            * @priv: Private driver interface data
4063            *
4064            * This command can be used to cancel a remain-on-channel operation
4065            * before its originally requested duration has passed. This could be
4066            * used, e.g., when remain_on_channel() is used to request extra time
4067            * to receive a response to an Action frame and the response is
4068            * received when there is still unneeded time remaining on the
4069            * remain-on-channel operation.
4070            */
4071           int (*cancel_remain_on_channel)(void *priv);
4072 
4073           /**
4074            * probe_req_report - Request Probe Request frames to be indicated
4075            * @priv: Private driver interface data
4076            * @report: Whether to report received Probe Request frames
4077            * Returns: 0 on success, -1 on failure (or if not supported)
4078            *
4079            * This command can be used to request the driver to indicate when
4080            * Probe Request frames are received with EVENT_RX_PROBE_REQ events.
4081            * Since this operation may require extra resources, e.g., due to less
4082            * optimal hardware/firmware RX filtering, many drivers may disable
4083            * Probe Request reporting at least in station mode. This command is
4084            * used to notify the driver when the Probe Request frames need to be
4085            * reported, e.g., during remain-on-channel operations.
4086            */
4087           int (*probe_req_report)(void *priv, int report);
4088 
4089           /**
4090            * deinit_ap - Deinitialize AP mode
4091            * @priv: Private driver interface data
4092            * Returns: 0 on success, -1 on failure (or if not supported)
4093            *
4094            * This optional function can be used to disable AP mode related
4095            * configuration. If the interface was not dynamically added,
4096            * change the driver mode to station mode to allow normal station
4097            * operations like scanning to be completed.
4098            */
4099           int (*deinit_ap)(void *priv);
4100 
4101           /**
4102            * deinit_p2p_cli - Deinitialize P2P client mode
4103            * @priv: Private driver interface data
4104            * Returns: 0 on success, -1 on failure (or if not supported)
4105            *
4106            * This optional function can be used to disable P2P client mode. If the
4107            * interface was not dynamically added, change the interface type back
4108            * to station mode.
4109            */
4110           int (*deinit_p2p_cli)(void *priv);
4111 
4112           /**
4113            * suspend - Notification on system suspend/hibernate event
4114            * @priv: Private driver interface data
4115            */
4116           void (*suspend)(void *priv);
4117 
4118           /**
4119            * resume - Notification on system resume/thaw event
4120            * @priv: Private driver interface data
4121            */
4122           void (*resume)(void *priv);
4123 
4124           /**
4125            * signal_monitor - Set signal monitoring parameters
4126            * @priv: Private driver interface data
4127            * @threshold: Threshold value for signal change events; 0 = disabled
4128            * @hysteresis: Minimum change in signal strength before indicating a
4129            *        new event
4130            * Returns: 0 on success, -1 on failure (or if not supported)
4131            *
4132            * This function can be used to configure monitoring of signal strength
4133            * with the current AP. Whenever signal strength drops below the
4134            * %threshold value or increases above it, EVENT_SIGNAL_CHANGE event
4135            * should be generated assuming the signal strength has changed at
4136            * least %hysteresis from the previously indicated signal change event.
4137            */
4138           int (*signal_monitor)(void *priv, int threshold, int hysteresis);
4139 
4140           /**
4141            * get_noa - Get current Notice of Absence attribute payload
4142            * @priv: Private driver interface data
4143            * @buf: Buffer for returning NoA
4144            * @buf_len: Buffer length in octets
4145            * Returns: Number of octets used in buf, 0 to indicate no NoA is being
4146            * advertized, or -1 on failure
4147            *
4148            * This function is used to fetch the current Notice of Absence
4149            * attribute value from GO.
4150            */
4151           int (*get_noa)(void *priv, u8 *buf, size_t buf_len);
4152 
4153           /**
4154            * set_noa - Set Notice of Absence parameters for GO (testing)
4155            * @priv: Private driver interface data
4156            * @count: Count
4157            * @start: Start time in ms from next TBTT
4158            * @duration: Duration in ms
4159            * Returns: 0 on success or -1 on failure
4160            *
4161            * This function is used to set Notice of Absence parameters for GO. It
4162            * is used only for testing. To disable NoA, all parameters are set to
4163            * 0.
4164            */
4165           int (*set_noa)(void *priv, u8 count, int start, int duration);
4166 
4167           /**
4168            * set_p2p_powersave - Set P2P power save options
4169            * @priv: Private driver interface data
4170            * @legacy_ps: 0 = disable, 1 = enable, 2 = maximum PS, -1 = no change
4171            * @opp_ps: 0 = disable, 1 = enable, -1 = no change
4172            * @ctwindow: 0.. = change (msec), -1 = no change
4173            * Returns: 0 on success or -1 on failure
4174            */
4175           int (*set_p2p_powersave)(void *priv, int legacy_ps, int opp_ps,
4176                                          int ctwindow);
4177 
4178           /**
4179            * ampdu - Enable/disable aggregation
4180            * @priv: Private driver interface data
4181            * @ampdu: 1/0 = enable/disable A-MPDU aggregation
4182            * Returns: 0 on success or -1 on failure
4183            */
4184           int (*ampdu)(void *priv, int ampdu);
4185 
4186           /**
4187            * get_radio_name - Get physical radio name for the device
4188            * @priv: Private driver interface data
4189            * Returns: Radio name or %NULL if not known
4190            *
4191            * The returned data must not be modified by the caller. It is assumed
4192            * that any interface that has the same radio name as another is
4193            * sharing the same physical radio. This information can be used to
4194            * share scan results etc. information between the virtual interfaces
4195            * to speed up various operations.
4196            */
4197           const char * (*get_radio_name)(void *priv);
4198 
4199           /**
4200            * send_tdls_mgmt - for sending TDLS management packets
4201            * @priv: private driver interface data
4202            * @dst: Destination (peer) MAC address
4203            * @action_code: TDLS action code for the mssage
4204            * @dialog_token: Dialog Token to use in the message (if needed)
4205            * @status_code: Status Code or Reason Code to use (if needed)
4206            * @peer_capab: TDLS peer capability (TDLS_PEER_* bitfield)
4207            * @initiator: Is the current end the TDLS link initiator
4208            * @buf: TDLS IEs to add to the message
4209            * @len: Length of buf in octets
4210            * @link_id: If >= 0 indicates the link of the AP MLD to specify the
4211            * operating channel on which to send a TDLS Discovery Response frame.
4212            * Returns: 0 on success, negative (<0) on failure
4213            *
4214            * This optional function can be used to send packet to driver which is
4215            * responsible for receiving and sending all TDLS packets.
4216            */
4217           int (*send_tdls_mgmt)(void *priv, const u8 *dst, u8 action_code,
4218                                     u8 dialog_token, u16 status_code, u32 peer_capab,
4219                                     int initiator, const u8 *buf, size_t len,
4220                                     int link_id);
4221 
4222           /**
4223            * tdls_oper - Ask the driver to perform high-level TDLS operations
4224            * @priv: Private driver interface data
4225            * @oper: TDLS high-level operation. See %enum tdls_oper
4226            * @peer: Destination (peer) MAC address
4227            * Returns: 0 on success, negative (<0) on failure
4228            *
4229            * This optional function can be used to send high-level TDLS commands
4230            * to the driver.
4231            */
4232           int (*tdls_oper)(void *priv, enum tdls_oper oper, const u8 *peer);
4233 
4234           /**
4235            * wnm_oper - Notify driver of the WNM frame reception
4236            * @priv: Private driver interface data
4237            * @oper: WNM operation. See %enum wnm_oper
4238            * @peer: Destination (peer) MAC address
4239            * @buf: Buffer for the driver to fill in (for getting IE)
4240            * @buf_len: Return the len of buf
4241            * Returns: 0 on success, negative (<0) on failure
4242            */
4243           int (*wnm_oper)(void *priv, enum wnm_oper oper, const u8 *peer,
4244                               u8 *buf, u16 *buf_len);
4245 
4246           /**
4247            * set_qos_map - Set QoS Map
4248            * @priv: Private driver interface data
4249            * @qos_map_set: QoS Map
4250            * @qos_map_set_len: Length of QoS Map
4251            */
4252           int (*set_qos_map)(void *priv, const u8 *qos_map_set,
4253                                  u8 qos_map_set_len);
4254 
4255           /**
4256            * br_add_ip_neigh - Add a neigh to the bridge ip neigh table
4257            * @priv: Private driver interface data
4258            * @version: IP version of the IP address, 4 or 6
4259            * @ipaddr: IP address for the neigh entry
4260            * @prefixlen: IP address prefix length
4261            * @addr: Corresponding MAC address
4262            * Returns: 0 on success, negative (<0) on failure
4263            */
4264           int (*br_add_ip_neigh)(void *priv, u8 version, const u8 *ipaddr,
4265                                      int prefixlen, const u8 *addr);
4266 
4267           /**
4268            * br_delete_ip_neigh - Remove a neigh from the bridge ip neigh table
4269            * @priv: Private driver interface data
4270            * @version: IP version of the IP address, 4 or 6
4271            * @ipaddr: IP address for the neigh entry
4272            * Returns: 0 on success, negative (<0) on failure
4273            */
4274           int (*br_delete_ip_neigh)(void *priv, u8 version, const u8 *ipaddr);
4275 
4276           /**
4277            * br_port_set_attr - Set a bridge port attribute
4278            * @attr: Bridge port attribute to set
4279            * @val: Value to be set
4280            * Returns: 0 on success, negative (<0) on failure
4281            */
4282           int (*br_port_set_attr)(void *priv, enum drv_br_port_attr attr,
4283                                         unsigned int val);
4284 
4285           /**
4286            * br_port_set_attr - Set a bridge network parameter
4287            * @param: Bridge parameter to set
4288            * @val: Value to be set
4289            * Returns: 0 on success, negative (<0) on failure
4290            */
4291           int (*br_set_net_param)(void *priv, enum drv_br_net_param param,
4292                                         unsigned int val);
4293 
4294           /**
4295            * get_wowlan - Get wake-on-wireless status
4296            * @priv: Private driver interface data
4297            */
4298           int (*get_wowlan)(void *priv);
4299 
4300           /**
4301            * set_wowlan - Set wake-on-wireless triggers
4302            * @priv: Private driver interface data
4303            * @triggers: wowlan triggers
4304            */
4305           int (*set_wowlan)(void *priv, const struct wowlan_triggers *triggers);
4306 
4307           /**
4308            * signal_poll - Get current connection information
4309            * @priv: Private driver interface data
4310            * @signal_info: Connection info structure
4311            */
4312           int (*signal_poll)(void *priv, struct wpa_signal_info *signal_info);
4313 
4314           /**
4315            * mlo_signal_poll - Get current MLO connection information
4316            * @priv: Private driver interface data
4317            * @mlo_signal_info: MLO connection info structure
4318            */
4319           int (*mlo_signal_poll)(void *priv,
4320                                      struct wpa_mlo_signal_info *mlo_signal_info);
4321 
4322           /**
4323            * channel_info - Get parameters of the current operating channel
4324            * @priv: Private driver interface data
4325            * @channel_info: Channel info structure
4326            * Returns: 0 on success, negative (<0) on failure
4327            */
4328           int (*channel_info)(void *priv, struct wpa_channel_info *channel_info);
4329 
4330           /**
4331            * set_authmode - Set authentication algorithm(s) for static WEP
4332            * @priv: Private driver interface data
4333            * @authmode: 1=Open System, 2=Shared Key, 3=both
4334            * Returns: 0 on success, -1 on failure
4335            *
4336            * This function can be used to set authentication algorithms for AP
4337            * mode when static WEP is used. If the driver uses user space MLME/SME
4338            * implementation, there is no need to implement this function.
4339            *
4340            * DEPRECATED - use set_ap() instead
4341            */
4342           int (*set_authmode)(void *priv, int authmode);
4343 
4344 #ifdef ANDROID
4345           /**
4346            * driver_cmd - Execute driver-specific command
4347            * @priv: Private driver interface data
4348            * @cmd: Command to execute
4349            * @buf: Return buffer
4350            * @buf_len: Buffer length
4351            * Returns: 0 on success, -1 on failure
4352            */
4353           int (*driver_cmd)(void *priv, char *cmd, char *buf, size_t buf_len);
4354 #endif /* ANDROID */
4355 
4356           /**
4357            * vendor_cmd - Execute vendor specific command
4358            * @priv: Private driver interface data
4359            * @vendor_id: Vendor id
4360            * @subcmd: Vendor command id
4361            * @nested_attr_flag: Specifies if vendor subcommand uses nested
4362            *        attributes or not
4363            * @data: Vendor command parameters (%NULL if no parameters)
4364            * @data_len: Data length
4365            * @buf: Return buffer (%NULL to ignore reply)
4366            * Returns: 0 on success, negative (<0) on failure
4367            *
4368            * This function handles vendor specific commands that are passed to
4369            * the driver/device. The command is identified by vendor id and
4370            * command id. The nested_attr_flag specifies whether the subcommand
4371            * uses nested attributes or not. Parameters can be passed
4372            * as argument to the command in the data buffer. Reply (if any) will be
4373            * filled in the supplied return buffer.
4374            *
4375            * The exact driver behavior is driver interface and vendor specific. As
4376            * an example, this will be converted to a vendor specific cfg80211
4377            * command in case of the nl80211 driver interface.
4378            */
4379           int (*vendor_cmd)(void *priv, unsigned int vendor_id,
4380                                 unsigned int subcmd, const u8 *data, size_t data_len,
4381                                 enum nested_attr nested_attr_flag,
4382                                 struct wpabuf *buf);
4383 
4384           /**
4385            * set_rekey_info - Set rekey information
4386            * @priv: Private driver interface data
4387            * @kek: Current KEK
4388            * @kek_len: KEK length in octets
4389            * @kck: Current KCK
4390            * @kck_len: KCK length in octets
4391            * @replay_ctr: Current EAPOL-Key Replay Counter
4392            *
4393            * This optional function can be used to provide information for the
4394            * driver/firmware to process EAPOL-Key frames in Group Key Handshake
4395            * while the host (including wpa_supplicant) is sleeping.
4396            */
4397           void (*set_rekey_info)(void *priv, const u8 *kek, size_t kek_len,
4398                                      const u8 *kck, size_t kck_len,
4399                                      const u8 *replay_ctr);
4400 
4401           /**
4402            * sta_assoc - Station association indication
4403            * @priv: Private driver interface data
4404            * @own_addr: Source address and BSSID for association frame
4405            * @addr: MAC address of the station to associate
4406            * @reassoc: flag to indicate re-association
4407            * @status: association response status code
4408            * @ie: assoc response ie buffer
4409            * @len: ie buffer length
4410            * Returns: 0 on success, -1 on failure
4411            *
4412            * This function indicates the driver to send (Re)Association
4413            * Response frame to the station.
4414            */
4415            int (*sta_assoc)(void *priv, const u8 *own_addr, const u8 *addr,
4416                                 int reassoc, u16 status, const u8 *ie, size_t len);
4417 
4418           /**
4419            * sta_auth - Station authentication indication
4420            * @priv: private driver interface data
4421            * @params: Station authentication parameters
4422            *
4423            * Returns: 0 on success, -1 on failure
4424            */
4425            int (*sta_auth)(void *priv,
4426                                struct wpa_driver_sta_auth_params *params);
4427 
4428           /**
4429            * add_tspec - Add traffic stream
4430            * @priv: Private driver interface data
4431            * @addr: MAC address of the station to associate
4432            * @tspec_ie: tspec ie buffer
4433            * @tspec_ielen: tspec ie length
4434            * Returns: 0 on success, -1 on failure
4435            *
4436            * This function adds the traffic steam for the station
4437            * and fills the medium_time in tspec_ie.
4438            */
4439            int (*add_tspec)(void *priv, const u8 *addr, u8 *tspec_ie,
4440                                 size_t tspec_ielen);
4441 
4442           /**
4443            * add_sta_node - Add a station node in the driver
4444            * @priv: Private driver interface data
4445            * @addr: MAC address of the station to add
4446            * @auth_alg: authentication algorithm used by the station
4447            * Returns: 0 on success, -1 on failure
4448            *
4449            * This function adds the station node in the driver, when
4450            * the station gets added by FT-over-DS.
4451            */
4452           int (*add_sta_node)(void *priv, const u8 *addr, u16 auth_alg);
4453 
4454           /**
4455            * sched_scan - Request the driver to initiate scheduled scan
4456            * @priv: Private driver interface data
4457            * @params: Scan parameters
4458            * Returns: 0 on success, -1 on failure
4459            *
4460            * This operation should be used for scheduled scan offload to
4461            * the hardware. Every time scan results are available, the
4462            * driver should report scan results event for wpa_supplicant
4463            * which will eventually request the results with
4464            * wpa_driver_get_scan_results2(). This operation is optional
4465            * and if not provided or if it returns -1, we fall back to
4466            * normal host-scheduled scans.
4467            */
4468           int (*sched_scan)(void *priv, struct wpa_driver_scan_params *params);
4469 
4470           /**
4471            * stop_sched_scan - Request the driver to stop a scheduled scan
4472            * @priv: Private driver interface data
4473            * Returns: 0 on success, -1 on failure
4474            *
4475            * This should cause the scheduled scan to be stopped and
4476            * results should stop being sent. Must be supported if
4477            * sched_scan is supported.
4478            */
4479           int (*stop_sched_scan)(void *priv);
4480 
4481           /**
4482            * poll_client - Probe (null data or such) the given station
4483            * @priv: Private driver interface data
4484            * @own_addr: MAC address of sending interface
4485            * @addr: MAC address of the station to probe
4486            * @qos: Indicates whether station is QoS station
4487            *
4488            * This function is used to verify whether an associated station is
4489            * still present. This function does not need to be implemented if the
4490            * driver provides such inactivity polling mechanism.
4491            */
4492           void (*poll_client)(void *priv, const u8 *own_addr,
4493                                   const u8 *addr, int qos);
4494 
4495           /**
4496            * radio_disable - Disable/enable radio
4497            * @priv: Private driver interface data
4498            * @disabled: 1=disable 0=enable radio
4499            * Returns: 0 on success, -1 on failure
4500            *
4501            * This optional command is for testing purposes. It can be used to
4502            * disable the radio on a testbed device to simulate out-of-radio-range
4503            * conditions.
4504            */
4505           int (*radio_disable)(void *priv, int disabled);
4506 
4507           /**
4508            * switch_channel - Announce channel switch and migrate the GO to the
4509            * given frequency
4510            * @priv: Private driver interface data
4511            * @settings: Settings for CSA period and new channel
4512            * Returns: 0 on success, -1 on failure
4513            *
4514            * This function is used to move the GO to the legacy STA channel to
4515            * avoid frequency conflict in single channel concurrency.
4516            */
4517           int (*switch_channel)(void *priv, struct csa_settings *settings);
4518 
4519           /**
4520            * switch_color - Announce color switch and migrate the BSS to the
4521            * given color
4522            * @priv: Private driver interface data
4523            * @settings: Settings for CCA period and new color
4524            * Returns: 0 on success, -1 on failure
4525            *
4526            * This function is used to move the BSS to its new color.
4527            */
4528           int (*switch_color)(void *priv, struct cca_settings *settings);
4529 
4530           /**
4531            * add_tx_ts - Add traffic stream
4532            * @priv: Private driver interface data
4533            * @tsid: Traffic stream ID
4534            * @addr: Receiver address
4535            * @user_prio: User priority of the traffic stream
4536            * @admitted_time: Admitted time for this TS in units of
4537            *        32 microsecond periods (per second).
4538            * Returns: 0 on success, -1 on failure
4539            */
4540           int (*add_tx_ts)(void *priv, u8 tsid, const u8 *addr, u8 user_prio,
4541                                u16 admitted_time);
4542 
4543           /**
4544            * del_tx_ts - Delete traffic stream
4545            * @priv: Private driver interface data
4546            * @tsid: Traffic stream ID
4547            * @addr: Receiver address
4548            * Returns: 0 on success, -1 on failure
4549            */
4550           int (*del_tx_ts)(void *priv, u8 tsid, const u8 *addr);
4551 
4552           /**
4553            * Enable channel-switching with TDLS peer
4554            * @priv: Private driver interface data
4555            * @addr: MAC address of the TDLS peer
4556            * @oper_class: Operating class of the switch channel
4557            * @params: Channel specification
4558            * Returns: 0 on success, -1 on failure
4559            *
4560            * The function indicates to driver that it can start switching to a
4561            * different channel with a specified TDLS peer. The switching is
4562            * assumed on until canceled with tdls_disable_channel_switch().
4563            */
4564           int (*tdls_enable_channel_switch)(
4565                     void *priv, const u8 *addr, u8 oper_class,
4566                     const struct hostapd_freq_params *params);
4567 
4568           /**
4569            * Disable channel switching with TDLS peer
4570            * @priv: Private driver interface data
4571            * @addr: MAC address of the TDLS peer
4572            * Returns: 0 on success, -1 on failure
4573            *
4574            * This function indicates to the driver that it should stop switching
4575            * with a given TDLS peer.
4576            */
4577           int (*tdls_disable_channel_switch)(void *priv, const u8 *addr);
4578 
4579           /**
4580            * start_dfs_cac - Listen for radar interference on the channel
4581            * @priv: Private driver interface data
4582            * @freq: Channel parameters
4583            * Returns: 0 on success, -1 on failure
4584            */
4585           int (*start_dfs_cac)(void *priv, struct hostapd_freq_params *freq);
4586 
4587           /**
4588            * stop_ap - Removes beacon from AP
4589            * @priv: Private driver interface data
4590            * @link_id: Link ID of the specified link; -1 for non-MLD
4591            * Returns: 0 on success, -1 on failure (or if not supported)
4592            *
4593            * This optional function can be used to disable AP mode related
4594            * configuration. Unlike deinit_ap, it does not change to station
4595            * mode.
4596            */
4597           int (*stop_ap)(void *priv, int link_id);
4598 
4599           /**
4600            * get_survey - Retrieve survey data
4601            * @priv: Private driver interface data
4602            * @freq: If set, survey data for the specified frequency is only
4603            *        being requested. If not set, all survey data is requested.
4604            * Returns: 0 on success, -1 on failure
4605            *
4606            * Use this to retrieve:
4607            *
4608            * - the observed channel noise floor
4609            * - the amount of time we have spent on the channel
4610            * - the amount of time during which we have spent on the channel that
4611            *   the radio has determined the medium is busy and we cannot
4612            *   transmit
4613            * - the amount of time we have spent receiving data
4614            * - the amount of time we have spent transmitting data
4615            *
4616            * This data can be used for spectrum heuristics. One example is
4617            * Automatic Channel Selection (ACS). The channel survey data is
4618            * kept on a linked list on the channel data, one entry is added
4619            * for each survey. The min_nf of the channel is updated for each
4620            * survey.
4621            */
4622           int (*get_survey)(void *priv, unsigned int freq);
4623 
4624           /**
4625            * status - Get driver interface status information
4626            * @priv: Private driver interface data
4627            * @buf: Buffer for printing the status information
4628            * @buflen: Maximum length of the buffer
4629            * Returns: Length of written status information or -1 on failure
4630            */
4631           int (*status)(void *priv, char *buf, size_t buflen);
4632 
4633           /**
4634            * roaming - Set roaming policy for driver-based BSS selection
4635            * @priv: Private driver interface data
4636            * @allowed: Whether roaming within ESS is allowed
4637            * @bssid: Forced BSSID if roaming is disabled or %NULL if not set
4638            * Returns: Length of written status information or -1 on failure
4639            *
4640            * This optional callback can be used to update roaming policy from the
4641            * associate() command (bssid being set there indicates that the driver
4642            * should not roam before getting this roaming() call to allow roaming.
4643            * If the driver does not indicate WPA_DRIVER_FLAGS_BSS_SELECTION
4644            * capability, roaming policy is handled within wpa_supplicant and there
4645            * is no need to implement or react to this callback.
4646            */
4647           int (*roaming)(void *priv, int allowed, const u8 *bssid);
4648 
4649           /**
4650            * disable_fils - Enable/disable FILS feature
4651            * @priv: Private driver interface data
4652            * @disable: 0-enable and 1-disable FILS feature
4653            * Returns: 0 on success, -1 on failure
4654            *
4655            * This callback can be used to configure driver and below layers to
4656            * enable/disable all FILS features.
4657            */
4658           int (*disable_fils)(void *priv, int disable);
4659 
4660           /**
4661            * set_mac_addr - Set MAC address
4662            * @priv: Private driver interface data
4663            * @addr: MAC address to use or %NULL for setting back to permanent
4664            * Returns: 0 on success, -1 on failure
4665            */
4666           int (*set_mac_addr)(void *priv, const u8 *addr);
4667 
4668 #ifdef CONFIG_MACSEC
4669           int (*macsec_init)(void *priv, struct macsec_init_params *params);
4670 
4671           int (*macsec_deinit)(void *priv);
4672 
4673           /**
4674            * macsec_get_capability - Inform MKA of this driver's capability
4675            * @priv: Private driver interface data
4676            * @cap: Driver's capability
4677            * Returns: 0 on success, -1 on failure
4678            */
4679           int (*macsec_get_capability)(void *priv, enum macsec_cap *cap);
4680 
4681           /**
4682            * enable_protect_frames - Set protect frames status
4683            * @priv: Private driver interface data
4684            * @enabled: true = protect frames enabled
4685            *           false = protect frames disabled
4686            * Returns: 0 on success, -1 on failure (or if not supported)
4687            */
4688           int (*enable_protect_frames)(void *priv, bool enabled);
4689 
4690           /**
4691            * enable_encrypt - Set encryption status
4692            * @priv: Private driver interface data
4693            * @enabled: true = encrypt outgoing traffic
4694            *           false = integrity-only protection on outgoing traffic
4695            * Returns: 0 on success, -1 on failure (or if not supported)
4696            */
4697           int (*enable_encrypt)(void *priv, bool enabled);
4698 
4699           /**
4700            * set_replay_protect - Set replay protect status and window size
4701            * @priv: Private driver interface data
4702            * @enabled: true = replay protect enabled
4703            *           false = replay protect disabled
4704            * @window: replay window size, valid only when replay protect enabled
4705            * Returns: 0 on success, -1 on failure (or if not supported)
4706            */
4707           int (*set_replay_protect)(void *priv, bool enabled, u32 window);
4708 
4709           /**
4710            * set_offload - Set MACsec hardware offload
4711            * @priv: Private driver interface data
4712            * @offload: 0 = MACSEC_OFFLOAD_OFF
4713            *           1 = MACSEC_OFFLOAD_PHY
4714            *           2 = MACSEC_OFFLOAD_MAC
4715            * Returns: 0 on success, -1 on failure (or if not supported)
4716            */
4717           int (*set_offload)(void *priv, u8 offload);
4718 
4719           /**
4720            * set_current_cipher_suite - Set current cipher suite
4721            * @priv: Private driver interface data
4722            * @cs: EUI64 identifier
4723            * Returns: 0 on success, -1 on failure (or if not supported)
4724            */
4725           int (*set_current_cipher_suite)(void *priv, u64 cs);
4726 
4727           /**
4728            * enable_controlled_port - Set controlled port status
4729            * @priv: Private driver interface data
4730            * @enabled: true = controlled port enabled
4731            *           false = controlled port disabled
4732            * Returns: 0 on success, -1 on failure (or if not supported)
4733            */
4734           int (*enable_controlled_port)(void *priv, bool enabled);
4735 
4736           /**
4737            * get_receive_lowest_pn - Get receive lowest pn
4738            * @priv: Private driver interface data
4739            * @sa: secure association
4740            * Returns: 0 on success, -1 on failure (or if not supported)
4741            */
4742           int (*get_receive_lowest_pn)(void *priv, struct receive_sa *sa);
4743 
4744           /**
4745            * get_transmit_next_pn - Get transmit next pn
4746            * @priv: Private driver interface data
4747            * @sa: secure association
4748            * Returns: 0 on success, -1 on failure (or if not supported)
4749            */
4750           int (*get_transmit_next_pn)(void *priv, struct transmit_sa *sa);
4751 
4752           /**
4753            * set_transmit_next_pn - Set transmit next pn
4754            * @priv: Private driver interface data
4755            * @sa: secure association
4756            * Returns: 0 on success, -1 on failure (or if not supported)
4757            */
4758           int (*set_transmit_next_pn)(void *priv, struct transmit_sa *sa);
4759 
4760           /**
4761            * set_receive_lowest_pn - Set receive lowest PN
4762            * @priv: Private driver interface data
4763            * @sa: secure association
4764            * Returns: 0 on success, -1 on failure (or if not supported)
4765            */
4766           int (*set_receive_lowest_pn)(void *priv, struct receive_sa *sa);
4767 
4768           /**
4769            * create_receive_sc - create secure channel for receiving
4770            * @priv: Private driver interface data
4771            * @sc: secure channel
4772            * @conf_offset: confidentiality offset (0, 30, or 50)
4773            * @validation: frame validation policy (0 = Disabled, 1 = Checked,
4774            *        2 = Strict)
4775            * Returns: 0 on success, -1 on failure (or if not supported)
4776            */
4777           int (*create_receive_sc)(void *priv, struct receive_sc *sc,
4778                                          unsigned int conf_offset,
4779                                          int validation);
4780 
4781           /**
4782            * delete_receive_sc - delete secure connection for receiving
4783            * @priv: private driver interface data from init()
4784            * @sc: secure channel
4785            * Returns: 0 on success, -1 on failure
4786            */
4787           int (*delete_receive_sc)(void *priv, struct receive_sc *sc);
4788 
4789           /**
4790            * create_receive_sa - create secure association for receive
4791            * @priv: private driver interface data from init()
4792            * @sa: secure association
4793            * Returns: 0 on success, -1 on failure
4794            */
4795           int (*create_receive_sa)(void *priv, struct receive_sa *sa);
4796 
4797           /**
4798            * delete_receive_sa - Delete secure association for receive
4799            * @priv: Private driver interface data from init()
4800            * @sa: Secure association
4801            * Returns: 0 on success, -1 on failure
4802            */
4803           int (*delete_receive_sa)(void *priv, struct receive_sa *sa);
4804 
4805           /**
4806            * enable_receive_sa - enable the SA for receive
4807            * @priv: private driver interface data from init()
4808            * @sa: secure association
4809            * Returns: 0 on success, -1 on failure
4810            */
4811           int (*enable_receive_sa)(void *priv, struct receive_sa *sa);
4812 
4813           /**
4814            * disable_receive_sa - disable SA for receive
4815            * @priv: private driver interface data from init()
4816            * @sa: secure association
4817            * Returns: 0 on success, -1 on failure
4818            */
4819           int (*disable_receive_sa)(void *priv, struct receive_sa *sa);
4820 
4821           /**
4822            * create_transmit_sc - create secure connection for transmit
4823            * @priv: private driver interface data from init()
4824            * @sc: secure channel
4825            * @conf_offset: confidentiality offset (0, 30, or 50)
4826            * Returns: 0 on success, -1 on failure
4827            */
4828           int (*create_transmit_sc)(void *priv, struct transmit_sc *sc,
4829                                           unsigned int conf_offset);
4830 
4831           /**
4832            * delete_transmit_sc - delete secure connection for transmit
4833            * @priv: private driver interface data from init()
4834            * @sc: secure channel
4835            * Returns: 0 on success, -1 on failure
4836            */
4837           int (*delete_transmit_sc)(void *priv, struct transmit_sc *sc);
4838 
4839           /**
4840            * create_transmit_sa - create secure association for transmit
4841            * @priv: private driver interface data from init()
4842            * @sa: secure association
4843            * Returns: 0 on success, -1 on failure
4844            */
4845           int (*create_transmit_sa)(void *priv, struct transmit_sa *sa);
4846 
4847           /**
4848            * delete_transmit_sa - Delete secure association for transmit
4849            * @priv: Private driver interface data from init()
4850            * @sa: Secure association
4851            * Returns: 0 on success, -1 on failure
4852            */
4853           int (*delete_transmit_sa)(void *priv, struct transmit_sa *sa);
4854 
4855           /**
4856            * enable_transmit_sa - enable SA for transmit
4857            * @priv: private driver interface data from init()
4858            * @sa: secure association
4859            * Returns: 0 on success, -1 on failure
4860            */
4861           int (*enable_transmit_sa)(void *priv, struct transmit_sa *sa);
4862 
4863           /**
4864            * disable_transmit_sa - disable SA for transmit
4865            * @priv: private driver interface data from init()
4866            * @sa: secure association
4867            * Returns: 0 on success, -1 on failure
4868            */
4869           int (*disable_transmit_sa)(void *priv, struct transmit_sa *sa);
4870 #endif /* CONFIG_MACSEC */
4871 
4872           /**
4873            * init_mesh - Driver specific initialization for mesh
4874            * @priv: Private driver interface data
4875            * Returns: 0 on success, -1 on failure
4876            */
4877           int (*init_mesh)(void *priv);
4878 
4879           /**
4880            * join_mesh - Join a mesh network
4881            * @priv: Private driver interface data
4882            * @params: Mesh configuration parameters
4883            * Returns: 0 on success, -1 on failure
4884            */
4885           int (*join_mesh)(void *priv,
4886                                struct wpa_driver_mesh_join_params *params);
4887 
4888           /**
4889            * leave_mesh - Leave a mesh network
4890            * @priv: Private driver interface data
4891            * Returns 0 on success, -1 on failure
4892            */
4893           int (*leave_mesh)(void *priv);
4894 
4895           /**
4896            * probe_mesh_link - Inject a frame over direct mesh link to a given
4897            *        peer skipping the next_hop lookup from mpath table.
4898            * @priv: Private driver interface data
4899            * @addr: Peer MAC address
4900            * @eth: Ethernet frame to be sent
4901            * @len: Ethernet frame lengtn in bytes
4902            * Returns 0 on success, -1 on failure
4903            */
4904           int (*probe_mesh_link)(void *priv, const u8 *addr, const u8 *eth,
4905                                      size_t len);
4906 
4907           /**
4908            * do_acs - Automatically select channel
4909            * @priv: Private driver interface data
4910            * @params: Parameters for ACS
4911            * Returns 0 on success, -1 on failure
4912            *
4913            * This command can be used to offload ACS to the driver if the driver
4914            * indicates support for such offloading (WPA_DRIVER_FLAGS_ACS_OFFLOAD).
4915            */
4916           int (*do_acs)(void *priv, struct drv_acs_params *params);
4917 
4918           /**
4919            * set_band - Notify driver of band(s) selection
4920            * @priv: Private driver interface data
4921            * @band_mask: The selected band(s) bit mask (from enum set_band)
4922            * Returns 0 on success, -1 on failure
4923            */
4924           int (*set_band)(void *priv, u32 band_mask);
4925 
4926           /**
4927            * get_pref_freq_list - Get preferred frequency list for an interface
4928            * @priv: Private driver interface data
4929            * @if_type: Interface type
4930            * @num: Number of channels
4931            * @freq_list: Weighted preferred channel list
4932            * Returns 0 on success, -1 on failure
4933            *
4934            * This command can be used to query the preferred frequency list from
4935            * the driver specific to a particular interface type. The freq_list
4936            * array needs to have room for *num entries. *num will be updated to
4937            * indicate the number of entries fetched from the driver.
4938            */
4939           int (*get_pref_freq_list)(void *priv, enum wpa_driver_if_type if_type,
4940                                           unsigned int *num,
4941                                           struct weighted_pcl *freq_list);
4942 
4943           /**
4944            * set_prob_oper_freq - Indicate probable P2P operating channel
4945            * @priv: Private driver interface data
4946            * @freq: Channel frequency in MHz
4947            * Returns 0 on success, -1 on failure
4948            *
4949            * This command can be used to inform the driver of the operating
4950            * frequency that an ongoing P2P group formation is likely to come up
4951            * on. Local device is assuming P2P Client role.
4952            */
4953           int (*set_prob_oper_freq)(void *priv, unsigned int freq);
4954 
4955           /**
4956            * abort_scan - Request the driver to abort an ongoing scan
4957            * @priv: Private driver interface data
4958            * @scan_cookie: Cookie identifying the scan request. This is used only
4959            *        when the vendor interface QCA_NL80211_VENDOR_SUBCMD_TRIGGER_SCAN
4960            *        was used to trigger scan. Otherwise, 0 is used.
4961            * Returns 0 on success, -1 on failure
4962            */
4963           int (*abort_scan)(void *priv, u64 scan_cookie);
4964 
4965           /**
4966            * configure_data_frame_filters - Request to configure frame filters
4967            * @priv: Private driver interface data
4968            * @filter_flags: The type of frames to filter (bitfield of
4969            * WPA_DATA_FRAME_FILTER_FLAG_*)
4970            * Returns: 0 on success or -1 on failure
4971            */
4972           int (*configure_data_frame_filters)(void *priv, u32 filter_flags);
4973 
4974           /**
4975            * get_ext_capab - Get extended capabilities for the specified interface
4976            * @priv: Private driver interface data
4977            * @type: Interface type for which to get extended capabilities
4978            * @ext_capab: Extended capabilities fetched
4979            * @ext_capab_mask: Extended capabilities mask
4980            * @ext_capab_len: Length of the extended capabilities
4981            * Returns: 0 on success or -1 on failure
4982            */
4983           int (*get_ext_capab)(void *priv, enum wpa_driver_if_type type,
4984                                    const u8 **ext_capab, const u8 **ext_capab_mask,
4985                                    unsigned int *ext_capab_len);
4986 
4987           /**
4988            * get_mld_capab - Get MLD capabilities for the specified interface
4989            * @priv: Private driver interface data
4990            * @type: Interface type for which to get MLD capabilities
4991            * @eml_capa: EML capabilities
4992            * @mld_capa_and_ops: MLD Capabilities and Operations
4993            * Returns: 0 on success or -1 on failure
4994            */
4995           int (*get_mld_capab)(void *priv, enum wpa_driver_if_type type,
4996                                    u16 *eml_capa, u16 *mld_capa_and_ops);
4997 
4998           /**
4999            * p2p_lo_start - Start offloading P2P listen to device
5000            * @priv: Private driver interface data
5001            * @freq: Listening frequency (MHz) for P2P listen
5002            * @period: Length of the listen operation in milliseconds
5003            * @interval: Interval for running the listen operation in milliseconds
5004            * @count: Number of times to run the listen operation
5005            * @device_types: Device primary and secondary types
5006            * @dev_types_len: Number of bytes for device_types
5007            * @ies: P2P IE and WSC IE for Probe Response frames
5008            * @ies_len: Length of ies in bytes
5009            * Returns: 0 on success or -1 on failure
5010            */
5011           int (*p2p_lo_start)(void *priv, unsigned int freq,
5012                                   unsigned int period, unsigned int interval,
5013                                   unsigned int count,
5014                                   const u8 *device_types, size_t dev_types_len,
5015                                   const u8 *ies, size_t ies_len);
5016 
5017           /**
5018            * p2p_lo_stop - Stop P2P listen offload
5019            * @priv: Private driver interface data
5020            * Returns: 0 on success or -1 on failure
5021            */
5022           int (*p2p_lo_stop)(void *priv);
5023 
5024           /**
5025            * set_default_scan_ies - Set default scan IEs
5026            * @priv: Private driver interface data
5027            * @ies: Scan default IEs buffer
5028            * @ies_len: Length of IEs in bytes
5029            * Returns: 0 on success or -1 on failure
5030            *
5031            * The driver can use these by default when there are no scan IEs coming
5032            * in the subsequent scan requests. Also in case of one or more of IEs
5033            * given in set_default_scan_ies() are missing in the subsequent scan
5034            * request, the driver should merge the missing scan IEs in the scan
5035            * request from the IEs set by set_default_scan_ies() in the Probe
5036            * Request frames sent.
5037            */
5038           int (*set_default_scan_ies)(void *priv, const u8 *ies, size_t ies_len);
5039 
5040           /**
5041            * set_tdls_mode - Set TDLS trigger mode to the host driver
5042            * @priv: Private driver interface data
5043            * @tdls_external_control: Represents if TDLS external trigger control
5044            *  mode is enabled/disabled.
5045            *
5046            * This optional callback can be used to configure the TDLS external
5047            * trigger control mode to the host driver.
5048            */
5049           int (*set_tdls_mode)(void *priv, int tdls_external_control);
5050 
5051           /**
5052            * get_bss_transition_status - Get candidate BSS's transition status
5053            * @priv: Private driver interface data
5054            * @params: Candidate BSS list
5055            *
5056            * Get the accept or reject reason code for a list of BSS transition
5057            * candidates.
5058            */
5059           struct wpa_bss_candidate_info *
5060           (*get_bss_transition_status)(void *priv,
5061                                              struct wpa_bss_trans_info *params);
5062           /**
5063            * ignore_assoc_disallow - Configure driver to ignore assoc_disallow
5064            * @priv: Private driver interface data
5065            * @ignore_disallow: 0 to not ignore, 1 to ignore
5066            * Returns: 0 on success, -1 on failure
5067            */
5068           int (*ignore_assoc_disallow)(void *priv, int ignore_disallow);
5069 
5070           /**
5071            * set_bssid_tmp_disallow - Set disallowed BSSIDs to the driver
5072            * @priv: Private driver interface data
5073            * @num_bssid: Number of temporarily disallowed BSSIDs
5074            * @bssids: List of temporarily disallowed BSSIDs
5075            */
5076           int (*set_bssid_tmp_disallow)(void *priv, unsigned int num_bssid,
5077                                               const u8 *bssid);
5078 
5079           /**
5080            * update_connect_params - Update the connection parameters
5081            * @priv: Private driver interface data
5082            * @params: Association parameters
5083            * @mask: Bit mask indicating which parameters in @params have to be
5084            *        updated
5085            * Returns: 0 on success, -1 on failure
5086            *
5087            * Update the connection parameters when in connected state so that the
5088            * driver uses the updated parameters for subsequent roaming. This is
5089            * used only with drivers that implement internal BSS selection and
5090            * roaming.
5091            */
5092           int (*update_connect_params)(
5093                     void *priv, struct wpa_driver_associate_params *params,
5094                     enum wpa_drv_update_connect_params_mask mask);
5095 
5096           /**
5097            * send_external_auth_status - Indicate the status of external
5098            * authentication processing to the host driver.
5099            * @priv: Private driver interface data
5100            * @params: Status of authentication processing.
5101            * Returns: 0 on success, -1 on failure
5102            */
5103           int (*send_external_auth_status)(void *priv,
5104                                                    struct external_auth *params);
5105 
5106           /**
5107            * set_4addr_mode - Set 4-address mode
5108            * @priv: Private driver interface data
5109            * @bridge_ifname: Bridge interface name
5110            * @val: 0 - disable 4addr mode, 1 - enable 4addr mode
5111            * Returns: 0 on success, < 0 on failure
5112            */
5113           int (*set_4addr_mode)(void *priv, const char *bridge_ifname, int val);
5114 
5115           /**
5116            * update_dh_ie - Update DH IE
5117            * @priv: Private driver interface data
5118            * @peer_mac: Peer MAC address
5119            * @reason_code: Reacon code
5120            * @ie: DH IE
5121            * @ie_len: DH IE length in bytes
5122            * Returns: 0 on success, -1 on failure
5123            *
5124            * This callback is used to let the driver know the DH processing result
5125            * and DH IE for a pending association.
5126            */
5127           int (*update_dh_ie)(void *priv, const u8 *peer_mac, u16 reason_code,
5128                                   const u8 *ie, size_t ie_len);
5129 
5130           /**
5131            * dpp_listen - Notify driver about start/stop of DPP listen
5132            * @priv: Private driver interface data
5133            * @enable: Whether listen state is enabled (or disabled)
5134            * Returns: 0 on success, -1 on failure
5135            *
5136            * This optional callback can be used to update RX frame filtering to
5137            * explicitly allow reception of broadcast Public Action frames.
5138            */
5139           int (*dpp_listen)(void *priv, bool enable);
5140 
5141           /**
5142            * set_secure_ranging_ctx - Add or delete secure ranging parameters of
5143            * the specified peer to the driver.
5144            * @priv: Private driver interface data
5145            * @params: Secure ranging parameters
5146            * Returns: 0 on success, -1 on failure
5147            *
5148            */
5149           int (*set_secure_ranging_ctx)(void *priv,
5150                                               struct secure_ranging_params *params);
5151 
5152           /**
5153            * send_pasn_resp - Send PASN response for a set of peers to the
5154            * driver.
5155            * @priv: Private driver interface data
5156            * @params: Parameters holding peers and respective status.
5157            * Returns: 0 on success, -1 on failure
5158            */
5159           int (*send_pasn_resp)(void *priv, struct pasn_auth *params);
5160 
5161           /**
5162            * get_sta_mlo_info - Get the current multi-link association info
5163            * @priv: Private driver interface data
5164            * @mlo: Pointer to fill multi-link association info
5165            * Returns: 0 on success, -1 on failure
5166            *
5167            * This callback is used to fetch multi-link of the current association.
5168            */
5169           int (*get_sta_mlo_info)(void *priv,
5170                                         struct driver_sta_mlo_info *mlo_info);
5171 
5172           /**
5173            * link_add - Add a link to the AP MLD interface
5174            * @priv: Private driver interface data
5175            * @link_id: The link ID
5176            * @addr: The MAC address to use for the link
5177            * @bss_ctx: BSS context for %WPA_IF_AP_BSS interfaces
5178            * Returns: 0 on success, negative value on failure
5179            */
5180           int (*link_add)(void *priv, u8 link_id, const u8 *addr, void *bss_ctx);
5181 
5182           /**
5183            * link_remove - Remove a link from the AP MLD interface
5184            * @priv: Private driver interface data
5185            * @type: Interface type
5186            * @ifname: Interface name of the virtual interface from where the link
5187            *        is to be removed.
5188            * @link_id: Valid link ID to remove
5189            * Returns: 0 on success, -1 on failure
5190            */
5191           int (*link_remove)(void *priv, enum wpa_driver_if_type type,
5192                                  const char *ifname, u8 link_id);
5193 
5194           /**
5195            * is_drv_shared - Check whether the driver interface is shared
5196            * @priv: Private driver interface data from init()
5197            * @bss_ctx: BSS context for %WPA_IF_AP_BSS interfaces
5198            *
5199            * Checks whether the driver interface is being used by other partner
5200            * BSS(s) or not. This is used to decide whether the driver interface
5201            * needs to be deinitilized when one interface is getting deinitialized.
5202            *
5203            * Returns: true if it is being used or else false.
5204            */
5205           bool (*is_drv_shared)(void *priv, void *bss_ctx);
5206 
5207           /**
5208            * link_sta_remove - Remove a link STA from an MLD STA
5209            * @priv: Private driver interface data
5210            * @link_id: The link ID which the link STA is using
5211            * @addr: The MLD MAC address of the MLD STA
5212            * Returns: 0 on success, negative value on failure
5213            */
5214           int (*link_sta_remove)(void *priv, u8 link_id, const u8 *addr);
5215 
5216 #ifdef CONFIG_TESTING_OPTIONS
5217           int (*register_frame)(void *priv, u16 type,
5218                                     const u8 *match, size_t match_len,
5219                                     bool multicast);
5220 #endif /* CONFIG_TESTING_OPTIONS */
5221 };
5222 
5223 /**
5224  * enum wpa_event_type - Event type for wpa_supplicant_event() calls
5225  */
5226 enum wpa_event_type {
5227           /**
5228            * EVENT_ASSOC - Association completed
5229            *
5230            * This event needs to be delivered when the driver completes IEEE
5231            * 802.11 association or reassociation successfully.
5232            * wpa_driver_ops::get_bssid() is expected to provide the current BSSID
5233            * after this event has been generated. In addition, optional
5234            * EVENT_ASSOCINFO may be generated just before EVENT_ASSOC to provide
5235            * more information about the association. If the driver interface gets
5236            * both of these events at the same time, it can also include the
5237            * assoc_info data in EVENT_ASSOC call.
5238            */
5239           EVENT_ASSOC,
5240 
5241           /**
5242            * EVENT_DISASSOC - Association lost
5243            *
5244            * This event should be called when association is lost either due to
5245            * receiving deauthenticate or disassociate frame from the AP or when
5246            * sending either of these frames to the current AP. If the driver
5247            * supports separate deauthentication event, EVENT_DISASSOC should only
5248            * be used for disassociation and EVENT_DEAUTH for deauthentication.
5249            * In AP mode, union wpa_event_data::disassoc_info is required.
5250            */
5251           EVENT_DISASSOC,
5252 
5253           /**
5254            * EVENT_MICHAEL_MIC_FAILURE - Michael MIC (TKIP) detected
5255            *
5256            * This event must be delivered when a Michael MIC error is detected by
5257            * the local driver. Additional data for event processing is
5258            * provided with union wpa_event_data::michael_mic_failure. This
5259            * information is used to request new encryption key and to initiate
5260            * TKIP countermeasures if needed.
5261            */
5262           EVENT_MICHAEL_MIC_FAILURE,
5263 
5264           /**
5265            * EVENT_SCAN_RESULTS - Scan results available
5266            *
5267            * This event must be called whenever scan results are available to be
5268            * fetched with struct wpa_driver_ops::get_scan_results(). This event
5269            * is expected to be used some time after struct wpa_driver_ops::scan()
5270            * is called. If the driver provides an unsolicited event when the scan
5271            * has been completed, this event can be used to trigger
5272            * EVENT_SCAN_RESULTS call. If such event is not available from the
5273            * driver, the driver wrapper code is expected to use a registered
5274            * timeout to generate EVENT_SCAN_RESULTS call after the time that the
5275            * scan is expected to be completed. Optional information about
5276            * completed scan can be provided with union wpa_event_data::scan_info.
5277            */
5278           EVENT_SCAN_RESULTS,
5279 
5280           /**
5281            * EVENT_ASSOCINFO - Report optional extra information for association
5282            *
5283            * This event can be used to report extra association information for
5284            * EVENT_ASSOC processing. This extra information includes IEs from
5285            * association frames and Beacon/Probe Response frames in union
5286            * wpa_event_data::assoc_info. EVENT_ASSOCINFO must be send just before
5287            * EVENT_ASSOC. Alternatively, the driver interface can include
5288            * assoc_info data in the EVENT_ASSOC call if it has all the
5289            * information available at the same point.
5290            */
5291           EVENT_ASSOCINFO,
5292 
5293           /**
5294            * EVENT_INTERFACE_STATUS - Report interface status changes
5295            *
5296            * This optional event can be used to report changes in interface
5297            * status (interface added/removed) using union
5298            * wpa_event_data::interface_status. This can be used to trigger
5299            * wpa_supplicant to stop and re-start processing for the interface,
5300            * e.g., when a cardbus card is ejected/inserted.
5301            */
5302           EVENT_INTERFACE_STATUS,
5303 
5304           /**
5305            * EVENT_PMKID_CANDIDATE - Report a candidate AP for pre-authentication
5306            *
5307            * This event can be used to inform wpa_supplicant about candidates for
5308            * RSN (WPA2) pre-authentication. If wpa_supplicant is not responsible
5309            * for scan request (ap_scan=2 mode), this event is required for
5310            * pre-authentication. If wpa_supplicant is performing scan request
5311            * (ap_scan=1), this event is optional since scan results can be used
5312            * to add pre-authentication candidates. union
5313            * wpa_event_data::pmkid_candidate is used to report the BSSID of the
5314            * candidate and priority of the candidate, e.g., based on the signal
5315            * strength, in order to try to pre-authenticate first with candidates
5316            * that are most likely targets for re-association.
5317            *
5318            * EVENT_PMKID_CANDIDATE can be called whenever the driver has updates
5319            * on the candidate list. In addition, it can be called for the current
5320            * AP and APs that have existing PMKSA cache entries. wpa_supplicant
5321            * will automatically skip pre-authentication in cases where a valid
5322            * PMKSA exists. When more than one candidate exists, this event should
5323            * be generated once for each candidate.
5324            *
5325            * Driver will be notified about successful pre-authentication with
5326            * struct wpa_driver_ops::add_pmkid() calls.
5327            */
5328           EVENT_PMKID_CANDIDATE,
5329 
5330           /**
5331            * EVENT_TDLS - Request TDLS operation
5332            *
5333            * This event can be used to request a TDLS operation to be performed.
5334            */
5335           EVENT_TDLS,
5336 
5337           /**
5338            * EVENT_FT_RESPONSE - Report FT (IEEE 802.11r) response IEs
5339            *
5340            * The driver is expected to report the received FT IEs from
5341            * FT authentication sequence from the AP. The FT IEs are included in
5342            * the extra information in union wpa_event_data::ft_ies.
5343            */
5344           EVENT_FT_RESPONSE,
5345 
5346           /**
5347            * EVENT_IBSS_RSN_START - Request RSN authentication in IBSS
5348            *
5349            * The driver can use this event to inform wpa_supplicant about a STA
5350            * in an IBSS with which protected frames could be exchanged. This
5351            * event starts RSN authentication with the other STA to authenticate
5352            * the STA and set up encryption keys with it.
5353            */
5354           EVENT_IBSS_RSN_START,
5355 
5356           /**
5357            * EVENT_AUTH - Authentication result
5358            *
5359            * This event should be called when authentication attempt has been
5360            * completed. This is only used if the driver supports separate
5361            * authentication step (struct wpa_driver_ops::authenticate).
5362            * Information about authentication result is included in
5363            * union wpa_event_data::auth.
5364            */
5365           EVENT_AUTH,
5366 
5367           /**
5368            * EVENT_DEAUTH - Authentication lost
5369            *
5370            * This event should be called when authentication is lost either due
5371            * to receiving deauthenticate frame from the AP or when sending that
5372            * frame to the current AP.
5373            * In AP mode, union wpa_event_data::deauth_info is required.
5374            */
5375           EVENT_DEAUTH,
5376 
5377           /**
5378            * EVENT_ASSOC_REJECT - Association rejected
5379            *
5380            * This event should be called when (re)association attempt has been
5381            * rejected by the AP. Information about the association response is
5382            * included in union wpa_event_data::assoc_reject.
5383            */
5384           EVENT_ASSOC_REJECT,
5385 
5386           /**
5387            * EVENT_AUTH_TIMED_OUT - Authentication timed out
5388            */
5389           EVENT_AUTH_TIMED_OUT,
5390 
5391           /**
5392            * EVENT_ASSOC_TIMED_OUT - Association timed out
5393            */
5394           EVENT_ASSOC_TIMED_OUT,
5395 
5396           /**
5397            * EVENT_WPS_BUTTON_PUSHED - Report hardware push button press for WPS
5398            */
5399           EVENT_WPS_BUTTON_PUSHED,
5400 
5401           /**
5402            * EVENT_TX_STATUS - Report TX status
5403            */
5404           EVENT_TX_STATUS,
5405 
5406           /**
5407            * EVENT_RX_FROM_UNKNOWN - Report RX from unknown STA
5408            */
5409           EVENT_RX_FROM_UNKNOWN,
5410 
5411           /**
5412            * EVENT_RX_MGMT - Report RX of a management frame
5413            */
5414           EVENT_RX_MGMT,
5415 
5416           /**
5417            * EVENT_REMAIN_ON_CHANNEL - Remain-on-channel duration started
5418            *
5419            * This event is used to indicate when the driver has started the
5420            * requested remain-on-channel duration. Information about the
5421            * operation is included in union wpa_event_data::remain_on_channel.
5422            */
5423           EVENT_REMAIN_ON_CHANNEL,
5424 
5425           /**
5426            * EVENT_CANCEL_REMAIN_ON_CHANNEL - Remain-on-channel timed out
5427            *
5428            * This event is used to indicate when the driver has completed
5429            * remain-on-channel duration, i.e., may noot be available on the
5430            * requested channel anymore. Information about the
5431            * operation is included in union wpa_event_data::remain_on_channel.
5432            */
5433           EVENT_CANCEL_REMAIN_ON_CHANNEL,
5434 
5435           /**
5436            * EVENT_RX_PROBE_REQ - Indicate received Probe Request frame
5437            *
5438            * This event is used to indicate when a Probe Request frame has been
5439            * received. Information about the received frame is included in
5440            * union wpa_event_data::rx_probe_req. The driver is required to report
5441            * these events only after successfully completed probe_req_report()
5442            * commands to request the events (i.e., report parameter is non-zero)
5443            * in station mode. In AP mode, Probe Request frames should always be
5444            * reported.
5445            */
5446           EVENT_RX_PROBE_REQ,
5447 
5448           /**
5449            * EVENT_NEW_STA - New wired device noticed
5450            *
5451            * This event is used to indicate that a new device has been detected
5452            * in a network that does not use association-like functionality (i.e.,
5453            * mainly wired Ethernet). This can be used to start EAPOL
5454            * authenticator when receiving a frame from a device. The address of
5455            * the device is included in union wpa_event_data::new_sta.
5456            */
5457           EVENT_NEW_STA,
5458 
5459           /**
5460            * EVENT_EAPOL_RX - Report received EAPOL frame
5461            *
5462            * When in AP mode with hostapd, this event is required to be used to
5463            * deliver the receive EAPOL frames from the driver.
5464            */
5465           EVENT_EAPOL_RX,
5466 
5467           /**
5468            * EVENT_SIGNAL_CHANGE - Indicate change in signal strength
5469            *
5470            * This event is used to indicate changes in the signal strength
5471            * observed in frames received from the current AP if signal strength
5472            * monitoring has been enabled with signal_monitor().
5473            */
5474           EVENT_SIGNAL_CHANGE,
5475 
5476           /**
5477            * EVENT_INTERFACE_ENABLED - Notify that interface was enabled
5478            *
5479            * This event is used to indicate that the interface was enabled after
5480            * having been previously disabled, e.g., due to rfkill.
5481            */
5482           EVENT_INTERFACE_ENABLED,
5483 
5484           /**
5485            * EVENT_INTERFACE_DISABLED - Notify that interface was disabled
5486            *
5487            * This event is used to indicate that the interface was disabled,
5488            * e.g., due to rfkill.
5489            */
5490           EVENT_INTERFACE_DISABLED,
5491 
5492           /**
5493            * EVENT_CHANNEL_LIST_CHANGED - Channel list changed
5494            *
5495            * This event is used to indicate that the channel list has changed,
5496            * e.g., because of a regulatory domain change triggered by scan
5497            * results including an AP advertising a country code.
5498            */
5499           EVENT_CHANNEL_LIST_CHANGED,
5500 
5501           /**
5502            * EVENT_INTERFACE_UNAVAILABLE - Notify that interface is unavailable
5503            *
5504            * This event is used to indicate that the driver cannot maintain this
5505            * interface in its operation mode anymore. The most likely use for
5506            * this is to indicate that AP mode operation is not available due to
5507            * operating channel would need to be changed to a DFS channel when
5508            * the driver does not support radar detection and another virtual
5509            * interfaces caused the operating channel to change. Other similar
5510            * resource conflicts could also trigger this for station mode
5511            * interfaces. This event can be propagated when channel switching
5512            * fails.
5513            */
5514           EVENT_INTERFACE_UNAVAILABLE,
5515 
5516           /**
5517            * EVENT_BEST_CHANNEL
5518            *
5519            * Driver generates this event whenever it detects a better channel
5520            * (e.g., based on RSSI or channel use). This information can be used
5521            * to improve channel selection for a new AP/P2P group.
5522            */
5523           EVENT_BEST_CHANNEL,
5524 
5525           /**
5526            * EVENT_UNPROT_DEAUTH - Unprotected Deauthentication frame received
5527            *
5528            * This event should be called when a Deauthentication frame is dropped
5529            * due to it not being protected (MFP/IEEE 802.11w).
5530            * union wpa_event_data::unprot_deauth is required to provide more
5531            * details of the frame.
5532            */
5533           EVENT_UNPROT_DEAUTH,
5534 
5535           /**
5536            * EVENT_UNPROT_DISASSOC - Unprotected Disassociation frame received
5537            *
5538            * This event should be called when a Disassociation frame is dropped
5539            * due to it not being protected (MFP/IEEE 802.11w).
5540            * union wpa_event_data::unprot_disassoc is required to provide more
5541            * details of the frame.
5542            */
5543           EVENT_UNPROT_DISASSOC,
5544 
5545           /**
5546            * EVENT_STATION_LOW_ACK
5547            *
5548            * Driver generates this event whenever it detected that a particular
5549            * station was lost. Detection can be through massive transmission
5550            * failures for example.
5551            */
5552           EVENT_STATION_LOW_ACK,
5553 
5554           /**
5555            * EVENT_IBSS_PEER_LOST - IBSS peer not reachable anymore
5556            */
5557           EVENT_IBSS_PEER_LOST,
5558 
5559           /**
5560            * EVENT_DRIVER_GTK_REKEY - Device/driver did GTK rekey
5561            *
5562            * This event carries the new replay counter to notify wpa_supplicant
5563            * of the current EAPOL-Key Replay Counter in case the driver/firmware
5564            * completed Group Key Handshake while the host (including
5565            * wpa_supplicant was sleeping).
5566            */
5567           EVENT_DRIVER_GTK_REKEY,
5568 
5569           /**
5570            * EVENT_SCHED_SCAN_STOPPED - Scheduled scan was stopped
5571            */
5572           EVENT_SCHED_SCAN_STOPPED,
5573 
5574           /**
5575            * EVENT_DRIVER_CLIENT_POLL_OK - Station responded to poll
5576            *
5577            * This event indicates that the station responded to the poll
5578            * initiated with @poll_client.
5579            */
5580           EVENT_DRIVER_CLIENT_POLL_OK,
5581 
5582           /**
5583            * EVENT_EAPOL_TX_STATUS - notify of EAPOL TX status
5584            */
5585           EVENT_EAPOL_TX_STATUS,
5586 
5587           /**
5588            * EVENT_CH_SWITCH - AP or GO decided to switch channels
5589            *
5590            * Described in wpa_event_data.ch_switch
5591            * */
5592           EVENT_CH_SWITCH,
5593 
5594           /**
5595            * EVENT_CH_SWITCH_STARTED - AP or GO started to switch channels
5596            *
5597            * This is a pre-switch event indicating the shortly following switch
5598            * of operating channels.
5599            *
5600            * Described in wpa_event_data.ch_switch
5601            */
5602           EVENT_CH_SWITCH_STARTED,
5603           /**
5604            * EVENT_WNM - Request WNM operation
5605            *
5606            * This event can be used to request a WNM operation to be performed.
5607            */
5608           EVENT_WNM,
5609 
5610           /**
5611            * EVENT_CONNECT_FAILED_REASON - Connection failure reason in AP mode
5612            *
5613            * This event indicates that the driver reported a connection failure
5614            * with the specified client (for example, max client reached, etc.) in
5615            * AP mode.
5616            */
5617           EVENT_CONNECT_FAILED_REASON,
5618 
5619           /**
5620            * EVENT_DFS_RADAR_DETECTED - Notify of radar detection
5621            *
5622            * A radar has been detected on the supplied frequency, hostapd should
5623            * react accordingly (e.g., change channel).
5624            */
5625           EVENT_DFS_RADAR_DETECTED,
5626 
5627           /**
5628            * EVENT_DFS_CAC_FINISHED - Notify that channel availability check has been completed
5629            *
5630            * After a successful CAC, the channel can be marked clear and used.
5631            */
5632           EVENT_DFS_CAC_FINISHED,
5633 
5634           /**
5635            * EVENT_DFS_CAC_ABORTED - Notify that channel availability check has been aborted
5636            *
5637            * The CAC was not successful, and the channel remains in the previous
5638            * state. This may happen due to a radar being detected or other
5639            * external influences.
5640            */
5641           EVENT_DFS_CAC_ABORTED,
5642 
5643           /**
5644            * EVENT_DFS_NOP_FINISHED - Notify that non-occupancy period is over
5645            *
5646            * The channel which was previously unavailable is now available again.
5647            */
5648           EVENT_DFS_NOP_FINISHED,
5649 
5650           /**
5651            * EVENT_SURVEY - Received survey data
5652            *
5653            * This event gets triggered when a driver query is issued for survey
5654            * data and the requested data becomes available. The returned data is
5655            * stored in struct survey_results. The results provide at most one
5656            * survey entry for each frequency and at minimum will provide one
5657            * survey entry for one frequency. The survey data can be os_malloc()'d
5658            * and then os_free()'d, so the event callback must only copy data.
5659            */
5660           EVENT_SURVEY,
5661 
5662           /**
5663            * EVENT_SCAN_STARTED - Scan started
5664            *
5665            * This indicates that driver has started a scan operation either based
5666            * on a request from wpa_supplicant/hostapd or from another application.
5667            * EVENT_SCAN_RESULTS is used to indicate when the scan has been
5668            * completed (either successfully or by getting cancelled).
5669            */
5670           EVENT_SCAN_STARTED,
5671 
5672           /**
5673            * EVENT_AVOID_FREQUENCIES - Received avoid frequency range
5674            *
5675            * This event indicates a set of frequency ranges that should be avoided
5676            * to reduce issues due to interference or internal co-existence
5677            * information in the driver.
5678            */
5679           EVENT_AVOID_FREQUENCIES,
5680 
5681           /**
5682            * EVENT_NEW_PEER_CANDIDATE - new (unknown) mesh peer notification
5683            */
5684           EVENT_NEW_PEER_CANDIDATE,
5685 
5686           /**
5687            * EVENT_ACS_CHANNEL_SELECTED - Received selected channels by ACS
5688            *
5689            * Indicates a pair of primary and secondary channels chosen by ACS
5690            * in device.
5691            */
5692           EVENT_ACS_CHANNEL_SELECTED,
5693 
5694           /**
5695            * EVENT_DFS_CAC_STARTED - Notify that channel availability check has
5696            * been started.
5697            *
5698            * This event indicates that channel availability check has been started
5699            * on a DFS frequency by a driver that supports DFS Offload.
5700            */
5701           EVENT_DFS_CAC_STARTED,
5702 
5703           /**
5704            * EVENT_P2P_LO_STOP - Notify that P2P listen offload is stopped
5705            */
5706           EVENT_P2P_LO_STOP,
5707 
5708           /**
5709            * EVENT_BEACON_LOSS - Beacon loss detected
5710            *
5711            * This event indicates that no Beacon frames has been received from
5712            * the current AP. This may indicate that the AP is not anymore in
5713            * range.
5714            */
5715           EVENT_BEACON_LOSS,
5716 
5717           /**
5718            * EVENT_DFS_PRE_CAC_EXPIRED - Notify that channel availability check
5719            * done previously (Pre-CAC) on the channel has expired. This would
5720            * normally be on a non-ETSI DFS regulatory domain. DFS state of the
5721            * channel will be moved from available to usable. A new CAC has to be
5722            * performed before start operating on this channel.
5723            */
5724           EVENT_DFS_PRE_CAC_EXPIRED,
5725 
5726           /**
5727            * EVENT_EXTERNAL_AUTH - This event interface is used by host drivers
5728            * that do not define separate commands for authentication and
5729            * association (~WPA_DRIVER_FLAGS_SME) but offload the 802.11
5730            * authentication to wpa_supplicant. This event carries all the
5731            * necessary information from the host driver for the authentication to
5732            * happen.
5733            */
5734           EVENT_EXTERNAL_AUTH,
5735 
5736           /**
5737            * EVENT_PORT_AUTHORIZED - Notification that a connection is authorized
5738            *
5739            * This event should be indicated when the driver completes the 4-way
5740            * handshake. This event should be preceded by an EVENT_ASSOC that
5741            * indicates the completion of IEEE 802.11 association.
5742            */
5743           EVENT_PORT_AUTHORIZED,
5744 
5745           /**
5746            * EVENT_STATION_OPMODE_CHANGED - Notify STA's HT/VHT operation mode
5747            * change event.
5748            */
5749           EVENT_STATION_OPMODE_CHANGED,
5750 
5751           /**
5752            * EVENT_INTERFACE_MAC_CHANGED - Notify that interface MAC changed
5753            *
5754            * This event is emitted when the MAC changes while the interface is
5755            * enabled. When an interface was disabled and becomes enabled, it
5756            * must be always assumed that the MAC possibly changed.
5757            */
5758           EVENT_INTERFACE_MAC_CHANGED,
5759 
5760           /**
5761            * EVENT_WDS_STA_INTERFACE_STATUS - Notify WDS STA interface status
5762            *
5763            * This event is emitted when an interface is added/removed for WDS STA.
5764            */
5765           EVENT_WDS_STA_INTERFACE_STATUS,
5766 
5767           /**
5768             * EVENT_UPDATE_DH - Notification of updated DH information
5769             */
5770           EVENT_UPDATE_DH,
5771 
5772           /**
5773            * EVENT_UNPROT_BEACON - Unprotected Beacon frame received
5774            *
5775            * This event should be called when a Beacon frame is dropped due to it
5776            * not being protected correctly. union wpa_event_data::unprot_beacon
5777            * is required to provide more details of the frame.
5778            */
5779           EVENT_UNPROT_BEACON,
5780 
5781           /**
5782            * EVENT_TX_WAIT_EXPIRE - TX wait timed out
5783            *
5784            * This event is used to indicate when the driver has completed
5785            * wait for a response frame based on a TX request that specified a
5786            * non-zero wait time and that has not been explicitly cancelled.
5787            */
5788           EVENT_TX_WAIT_EXPIRE,
5789 
5790           /**
5791             * EVENT_BSS_COLOR_COLLISION - Notification of a BSS color collision
5792             */
5793           EVENT_BSS_COLOR_COLLISION,
5794 
5795           /**
5796            * EVENT_CCA_STARTED_NOTIFY - Notification that CCA has started
5797            */
5798           EVENT_CCA_STARTED_NOTIFY,
5799 
5800           /**
5801            * EVENT_CCA_ABORTED_NOTIFY - Notification that CCA has aborted
5802            */
5803           EVENT_CCA_ABORTED_NOTIFY,
5804 
5805           /**
5806            * EVENT_CCA_NOTIFY - Notification that CCA has completed
5807            */
5808           EVENT_CCA_NOTIFY,
5809 
5810           /**
5811            * EVENT_PASN_AUTH - This event is used by the driver that requests
5812            * PASN authentication and secure ranging context for multiple peers.
5813            */
5814           EVENT_PASN_AUTH,
5815 
5816           /**
5817            * EVENT_LINK_CH_SWITCH - MLD AP link decided to switch channels
5818            *
5819            * Described in wpa_event_data.ch_switch.
5820            *
5821            */
5822           EVENT_LINK_CH_SWITCH,
5823 
5824           /**
5825            * EVENT_LINK_CH_SWITCH_STARTED - MLD AP link started to switch channels
5826            *
5827            * This is a pre-switch event indicating the shortly following switch
5828            * of operating channels.
5829            *
5830            * Described in wpa_event_data.ch_switch.
5831            */
5832           EVENT_LINK_CH_SWITCH_STARTED,
5833 
5834           /**
5835            * EVENT_TID_LINK_MAP - MLD event to set TID-to-link mapping
5836            *
5837            * This event is used by the driver to indicate the received TID-to-link
5838            * mapping response from the associated AP MLD.
5839            *
5840            * Described in wpa_event_data.t2l_map_info.
5841            */
5842           EVENT_TID_LINK_MAP,
5843 
5844           /**
5845            * EVENT_LINK_RECONFIG - Notification that AP links removed
5846            */
5847           EVENT_LINK_RECONFIG,
5848 };
5849 
5850 
5851 /**
5852  * struct freq_survey - Channel survey info
5853  *
5854  * @ifidx: Interface index in which this survey was observed
5855  * @freq: Center of frequency of the surveyed channel
5856  * @nf: Channel noise floor in dBm
5857  * @channel_time: Amount of time in ms the radio spent on the channel
5858  * @channel_time_busy: Amount of time in ms the radio detected some signal
5859  *     that indicated to the radio the channel was not clear
5860  * @channel_time_rx: Amount of time the radio spent receiving data
5861  * @channel_time_tx: Amount of time the radio spent transmitting data
5862  * @filled: bitmask indicating which fields have been reported, see
5863  *     SURVEY_HAS_* defines.
5864  * @list: Internal list pointers
5865  */
5866 struct freq_survey {
5867           u32 ifidx;
5868           unsigned int freq;
5869           s8 nf;
5870           u64 channel_time;
5871           u64 channel_time_busy;
5872           u64 channel_time_rx;
5873           u64 channel_time_tx;
5874           unsigned int filled;
5875           struct dl_list list;
5876 };
5877 
5878 #define SURVEY_HAS_NF BIT(0)
5879 #define SURVEY_HAS_CHAN_TIME BIT(1)
5880 #define SURVEY_HAS_CHAN_TIME_BUSY BIT(2)
5881 #define SURVEY_HAS_CHAN_TIME_RX BIT(3)
5882 #define SURVEY_HAS_CHAN_TIME_TX BIT(4)
5883 
5884 /**
5885  * enum sta_connect_fail_reason_codes - STA connect failure reason code values
5886  * @STA_CONNECT_FAIL_REASON_UNSPECIFIED: No reason code specified for
5887  *        connection failure.
5888  * @STA_CONNECT_FAIL_REASON_NO_BSS_FOUND: No Probe Response frame received
5889  *        for unicast Probe Request frame.
5890  * @STA_CONNECT_FAIL_REASON_AUTH_TX_FAIL: STA failed to send auth request.
5891  * @STA_CONNECT_FAIL_REASON_AUTH_NO_ACK_RECEIVED: AP didn't send ACK for
5892  *        auth request.
5893  * @STA_CONNECT_FAIL_REASON_AUTH_NO_RESP_RECEIVED: Auth response is not
5894  *        received from AP.
5895  * @STA_CONNECT_FAIL_REASON_ASSOC_REQ_TX_FAIL: STA failed to send
5896  *        Association Request frame.
5897  * @STA_CONNECT_FAIL_REASON_ASSOC_NO_ACK_RECEIVED: AP didn't send ACK for
5898  *        Association Request frame.
5899  * @STA_CONNECT_FAIL_REASON_ASSOC_NO_RESP_RECEIVED: Association Response
5900  *        frame is not received from AP.
5901  */
5902 enum sta_connect_fail_reason_codes {
5903           STA_CONNECT_FAIL_REASON_UNSPECIFIED = 0,
5904           STA_CONNECT_FAIL_REASON_NO_BSS_FOUND = 1,
5905           STA_CONNECT_FAIL_REASON_AUTH_TX_FAIL = 2,
5906           STA_CONNECT_FAIL_REASON_AUTH_NO_ACK_RECEIVED = 3,
5907           STA_CONNECT_FAIL_REASON_AUTH_NO_RESP_RECEIVED = 4,
5908           STA_CONNECT_FAIL_REASON_ASSOC_REQ_TX_FAIL = 5,
5909           STA_CONNECT_FAIL_REASON_ASSOC_NO_ACK_RECEIVED = 6,
5910           STA_CONNECT_FAIL_REASON_ASSOC_NO_RESP_RECEIVED = 7,
5911 };
5912 
5913 /**
5914  * union wpa_event_data - Additional data for wpa_supplicant_event() calls
5915  */
5916 union wpa_event_data {
5917           /**
5918            * struct assoc_info - Data for EVENT_ASSOC and EVENT_ASSOCINFO events
5919            *
5920            * This structure is optional for EVENT_ASSOC calls and required for
5921            * EVENT_ASSOCINFO calls. By using EVENT_ASSOC with this data, the
5922            * driver interface does not need to generate separate EVENT_ASSOCINFO
5923            * calls.
5924            */
5925           struct assoc_info {
5926                     /**
5927                      * reassoc - Flag to indicate association or reassociation
5928                      */
5929                     int reassoc;
5930 
5931                     /**
5932                      * req_ies - (Re)Association Request IEs
5933                      *
5934                      * If the driver generates WPA/RSN IE, this event data must be
5935                      * returned for WPA handshake to have needed information. If
5936                      * wpa_supplicant-generated WPA/RSN IE is used, this
5937                      * information event is optional.
5938                      *
5939                      * This should start with the first IE (fixed fields before IEs
5940                      * are not included).
5941                      */
5942                     const u8 *req_ies;
5943 
5944                     /**
5945                      * req_ies_len - Length of req_ies in bytes
5946                      */
5947                     size_t req_ies_len;
5948 
5949                     /**
5950                      * resp_ies - (Re)Association Response IEs
5951                      *
5952                      * Optional association data from the driver. This data is not
5953                      * required WPA, but may be useful for some protocols and as
5954                      * such, should be reported if this is available to the driver
5955                      * interface.
5956                      *
5957                      * This should start with the first IE (fixed fields before IEs
5958                      * are not included).
5959                      */
5960                     const u8 *resp_ies;
5961 
5962                     /**
5963                      * resp_ies_len - Length of resp_ies in bytes
5964                      */
5965                     size_t resp_ies_len;
5966 
5967                     /**
5968                      * resp_frame - (Re)Association Response frame
5969                      */
5970                     const u8 *resp_frame;
5971 
5972                     /**
5973                      * resp_frame_len - (Re)Association Response frame length
5974                      */
5975                     size_t resp_frame_len;
5976 
5977                     /**
5978                      * beacon_ies - Beacon or Probe Response IEs
5979                      *
5980                      * Optional Beacon/ProbeResp data: IEs included in Beacon or
5981                      * Probe Response frames from the current AP (i.e., the one
5982                      * that the client just associated with). This information is
5983                      * used to update WPA/RSN IE for the AP. If this field is not
5984                      * set, the results from previous scan will be used. If no
5985                      * data for the new AP is found, scan results will be requested
5986                      * again (without scan request). At this point, the driver is
5987                      * expected to provide WPA/RSN IE for the AP (if WPA/WPA2 is
5988                      * used).
5989                      *
5990                      * This should start with the first IE (fixed fields before IEs
5991                      * are not included).
5992                      */
5993                     const u8 *beacon_ies;
5994 
5995                     /**
5996                      * beacon_ies_len - Length of beacon_ies */
5997                     size_t beacon_ies_len;
5998 
5999                     /**
6000                      * freq - Frequency of the operational channel in MHz
6001                      */
6002                     unsigned int freq;
6003 
6004                     /**
6005                      * wmm_params - WMM parameters used in this association.
6006                      */
6007                     struct wmm_params wmm_params;
6008 
6009                     /**
6010                      * addr - Station address (for AP mode)
6011                      */
6012                     const u8 *addr;
6013 
6014                     /**
6015                      * The following is the key management offload information
6016                      * @authorized
6017                      * @key_replay_ctr
6018                      * @key_replay_ctr_len
6019                      * @ptk_kck
6020                      * @ptk_kek_len
6021                      * @ptk_kek
6022                      * @ptk_kek_len
6023                      */
6024 
6025                     /**
6026                      * authorized - Status of key management offload,
6027                      * 1 = successful
6028                      */
6029                     int authorized;
6030 
6031                     /**
6032                      * key_replay_ctr - Key replay counter value last used
6033                      * in a valid EAPOL-Key frame
6034                      */
6035                     const u8 *key_replay_ctr;
6036 
6037                     /**
6038                      * key_replay_ctr_len - The length of key_replay_ctr
6039                      */
6040                     size_t key_replay_ctr_len;
6041 
6042                     /**
6043                      * ptk_kck - The derived PTK KCK
6044                      */
6045                     const u8 *ptk_kck;
6046 
6047                     /**
6048                      * ptk_kek_len - The length of ptk_kck
6049                      */
6050                     size_t ptk_kck_len;
6051 
6052                     /**
6053                      * ptk_kek - The derived PTK KEK
6054                      * This is used in key management offload and also in FILS SK
6055                      * offload.
6056                      */
6057                     const u8 *ptk_kek;
6058 
6059                     /**
6060                      * ptk_kek_len - The length of ptk_kek
6061                      */
6062                     size_t ptk_kek_len;
6063 
6064                     /**
6065                      * subnet_status - The subnet status:
6066                      * 0 = unknown, 1 = unchanged, 2 = changed
6067                      */
6068                     u8 subnet_status;
6069 
6070                     /**
6071                      * The following information is used in FILS SK offload
6072                      * @fils_erp_next_seq_num
6073                      * @fils_pmk
6074                      * @fils_pmk_len
6075                      * @fils_pmkid
6076                      */
6077 
6078                     /**
6079                      * fils_erp_next_seq_num - The next sequence number to use in
6080                      * FILS ERP messages
6081                      */
6082                     u16 fils_erp_next_seq_num;
6083 
6084                     /**
6085                      * fils_pmk - A new PMK if generated in case of FILS
6086                      * authentication
6087                      */
6088                     const u8 *fils_pmk;
6089 
6090                     /**
6091                      * fils_pmk_len - Length of fils_pmk
6092                      */
6093                     size_t fils_pmk_len;
6094 
6095                     /**
6096                      * fils_pmkid - PMKID used or generated in FILS authentication
6097                      */
6098                     const u8 *fils_pmkid;
6099 
6100                     /**
6101                      * link_addr - Link address of the STA
6102                      */
6103                     const u8 *link_addr;
6104 
6105                     /**
6106                      * assoc_link_id - Association link id of the MLO association or
6107                      *        -1 if MLO is not used
6108                      */
6109                     int assoc_link_id;
6110           } assoc_info;
6111 
6112           /**
6113            * struct disassoc_info - Data for EVENT_DISASSOC events
6114            */
6115           struct disassoc_info {
6116                     /**
6117                      * addr - Station address (for AP mode)
6118                      */
6119                     const u8 *addr;
6120 
6121                     /**
6122                      * reason_code - Reason Code (host byte order) used in
6123                      *        Deauthentication frame
6124                      */
6125                     u16 reason_code;
6126 
6127                     /**
6128                      * ie - Optional IE(s) in Disassociation frame
6129                      */
6130                     const u8 *ie;
6131 
6132                     /**
6133                      * ie_len - Length of ie buffer in octets
6134                      */
6135                     size_t ie_len;
6136 
6137                     /**
6138                      * locally_generated - Whether the frame was locally generated
6139                      */
6140                     int locally_generated;
6141           } disassoc_info;
6142 
6143           /**
6144            * struct deauth_info - Data for EVENT_DEAUTH events
6145            */
6146           struct deauth_info {
6147                     /**
6148                      * addr - Station address (for AP mode)
6149                      */
6150                     const u8 *addr;
6151 
6152                     /**
6153                      * reason_code - Reason Code (host byte order) used in
6154                      *        Deauthentication frame
6155                      */
6156                     u16 reason_code;
6157 
6158                     /**
6159                      * ie - Optional IE(s) in Deauthentication frame
6160                      */
6161                     const u8 *ie;
6162 
6163                     /**
6164                      * ie_len - Length of ie buffer in octets
6165                      */
6166                     size_t ie_len;
6167 
6168                     /**
6169                      * locally_generated - Whether the frame was locally generated
6170                      */
6171                     int locally_generated;
6172           } deauth_info;
6173 
6174           /**
6175            * struct michael_mic_failure - Data for EVENT_MICHAEL_MIC_FAILURE
6176            */
6177           struct michael_mic_failure {
6178                     int unicast;
6179                     const u8 *src;
6180           } michael_mic_failure;
6181 
6182           /**
6183            * struct interface_status - Data for EVENT_INTERFACE_STATUS
6184            */
6185           struct interface_status {
6186                     unsigned int ifindex;
6187                     char ifname[100];
6188                     enum {
6189                               EVENT_INTERFACE_ADDED, EVENT_INTERFACE_REMOVED
6190                     } ievent;
6191           } interface_status;
6192 
6193           /**
6194            * struct pmkid_candidate - Data for EVENT_PMKID_CANDIDATE
6195            */
6196           struct pmkid_candidate {
6197                     /** BSSID of the PMKID candidate */
6198                     u8 bssid[ETH_ALEN];
6199                     /** Smaller the index, higher the priority */
6200                     int index;
6201                     /** Whether RSN IE includes pre-authenticate flag */
6202                     int preauth;
6203           } pmkid_candidate;
6204 
6205           /**
6206            * struct tdls - Data for EVENT_TDLS
6207            */
6208           struct tdls {
6209                     u8 peer[ETH_ALEN];
6210                     enum {
6211                               TDLS_REQUEST_SETUP,
6212                               TDLS_REQUEST_TEARDOWN,
6213                               TDLS_REQUEST_DISCOVER,
6214                     } oper;
6215                     u16 reason_code; /* for teardown */
6216           } tdls;
6217 
6218           /**
6219            * struct wnm - Data for EVENT_WNM
6220            */
6221           struct wnm {
6222                     u8 addr[ETH_ALEN];
6223                     enum {
6224                               WNM_OPER_SLEEP,
6225                     } oper;
6226                     enum {
6227                               WNM_SLEEP_ENTER,
6228                               WNM_SLEEP_EXIT
6229                     } sleep_action;
6230                     int sleep_intval;
6231                     u16 reason_code;
6232                     u8 *buf;
6233                     u16 buf_len;
6234           } wnm;
6235 
6236           /**
6237            * struct ft_ies - FT information elements (EVENT_FT_RESPONSE)
6238            *
6239            * During FT (IEEE 802.11r) authentication sequence, the driver is
6240            * expected to use this event to report received FT IEs (MDIE, FTIE,
6241            * RSN IE, TIE, possible resource request) to the supplicant. The FT
6242            * IEs for the next message will be delivered through the
6243            * struct wpa_driver_ops::update_ft_ies() callback.
6244            */
6245           struct ft_ies {
6246                     const u8 *ies;
6247                     size_t ies_len;
6248                     int ft_action;
6249                     u8 target_ap[ETH_ALEN];
6250                     /** Optional IE(s), e.g., WMM TSPEC(s), for RIC-Request */
6251                     const u8 *ric_ies;
6252                     /** Length of ric_ies buffer in octets */
6253                     size_t ric_ies_len;
6254           } ft_ies;
6255 
6256           /**
6257            * struct ibss_rsn_start - Data for EVENT_IBSS_RSN_START
6258            */
6259           struct ibss_rsn_start {
6260                     u8 peer[ETH_ALEN];
6261           } ibss_rsn_start;
6262 
6263           /**
6264            * struct auth_info - Data for EVENT_AUTH events
6265            */
6266           struct auth_info {
6267                     u8 peer[ETH_ALEN];
6268                     u8 bssid[ETH_ALEN];
6269                     u16 auth_type;
6270                     u16 auth_transaction;
6271                     u16 status_code;
6272                     const u8 *ies;
6273                     size_t ies_len;
6274           } auth;
6275 
6276           /**
6277            * struct assoc_reject - Data for EVENT_ASSOC_REJECT events
6278            */
6279           struct assoc_reject {
6280                     /**
6281                      * bssid - BSSID of the AP that rejected association
6282                      */
6283                     const u8 *bssid;
6284 
6285                     /**
6286                      * resp_ies - (Re)Association Response IEs
6287                      *
6288                      * Optional association data from the driver. This data is not
6289                      * required WPA, but may be useful for some protocols and as
6290                      * such, should be reported if this is available to the driver
6291                      * interface.
6292                      *
6293                      * This should start with the first IE (fixed fields before IEs
6294                      * are not included).
6295                      */
6296                     const u8 *resp_ies;
6297 
6298                     /**
6299                      * resp_ies_len - Length of resp_ies in bytes
6300                      */
6301                     size_t resp_ies_len;
6302 
6303                     /**
6304                      * status_code - Status Code from (Re)association Response
6305                      */
6306                     u16 status_code;
6307 
6308                     /**
6309                      * timed_out - Whether failure is due to timeout (etc.) rather
6310                      * than explicit rejection response from the AP.
6311                      */
6312                     int timed_out;
6313 
6314                     /**
6315                      * timeout_reason - Reason for the timeout
6316                      */
6317                     const char *timeout_reason;
6318 
6319                     /**
6320                      * fils_erp_next_seq_num - The next sequence number to use in
6321                      * FILS ERP messages
6322                      */
6323                     u16 fils_erp_next_seq_num;
6324 
6325                     /**
6326                      * reason_code - Connection failure reason code from the driver
6327                      */
6328                     enum sta_connect_fail_reason_codes reason_code;
6329           } assoc_reject;
6330 
6331           struct timeout_event {
6332                     u8 addr[ETH_ALEN];
6333           } timeout_event;
6334 
6335           /**
6336            * struct tx_status - Data for EVENT_TX_STATUS events
6337            */
6338           struct tx_status {
6339                     u16 type;
6340                     u16 stype;
6341                     const u8 *dst;
6342                     const u8 *data;
6343                     size_t data_len;
6344                     int ack;
6345                     int link_id;
6346           } tx_status;
6347 
6348           /**
6349            * struct rx_from_unknown - Data for EVENT_RX_FROM_UNKNOWN events
6350            */
6351           struct rx_from_unknown {
6352                     const u8 *bssid;
6353                     const u8 *addr;
6354                     int wds;
6355           } rx_from_unknown;
6356 
6357           /**
6358            * struct rx_mgmt - Data for EVENT_RX_MGMT events
6359            */
6360           struct rx_mgmt {
6361                     const u8 *frame;
6362                     size_t frame_len;
6363                     u32 datarate;
6364 
6365                     /**
6366                      * drv_priv - Pointer to store driver private BSS information
6367                      *
6368                      * If not set to NULL, this is used for comparison with
6369                      * hostapd_data->drv_priv to determine which BSS should process
6370                      * the frame.
6371                      */
6372                     void *drv_priv;
6373 
6374                     /**
6375                      * ctx - Pointer to store ctx of private BSS information
6376                      *
6377                      * If not set to NULL, this is used for forwarding the packet
6378                      * to right link BSS of ML BSS.
6379                      */
6380                     void *ctx;
6381 
6382                     /**
6383                      * freq - Frequency (in MHz) on which the frame was received
6384                      */
6385                     int freq;
6386 
6387                     /**
6388                      * ssi_signal - Signal strength in dBm (or 0 if not available)
6389                      */
6390                     int ssi_signal;
6391 
6392                     /**
6393                      * link_id - MLO link on which the frame was received or -1 for
6394                      * non MLD.
6395                      */
6396                     int link_id;
6397           } rx_mgmt;
6398 
6399           /**
6400            * struct remain_on_channel - Data for EVENT_REMAIN_ON_CHANNEL events
6401            *
6402            * This is also used with EVENT_CANCEL_REMAIN_ON_CHANNEL events.
6403            */
6404           struct remain_on_channel {
6405                     /**
6406                      * freq - Channel frequency in MHz
6407                      */
6408                     unsigned int freq;
6409 
6410                     /**
6411                      * duration - Duration to remain on the channel in milliseconds
6412                      */
6413                     unsigned int duration;
6414           } remain_on_channel;
6415 
6416           /**
6417            * struct scan_info - Optional data for EVENT_SCAN_RESULTS events
6418            * @aborted: Whether the scan was aborted
6419            * @freqs: Scanned frequencies in MHz (%NULL = all channels scanned)
6420            * @num_freqs: Number of entries in freqs array
6421            * @ssids: Scanned SSIDs (%NULL or zero-length SSID indicates wildcard
6422            *        SSID)
6423            * @num_ssids: Number of entries in ssids array
6424            * @external_scan: Whether the scan info is for an external scan
6425            * @nl_scan_event: 1 if the source of this scan event is a normal scan,
6426            *        0 if the source of the scan event is a vendor scan
6427            * @scan_start_tsf: Time when the scan started in terms of TSF of the
6428            *        BSS that the interface that requested the scan is connected to
6429            *        (if available).
6430            * @scan_start_tsf_bssid: The BSSID according to which %scan_start_tsf
6431            *        is set.
6432            * @scan_cookie: Unique identification representing the corresponding
6433            *      scan request. 0 if no unique identification is available.
6434            */
6435           struct scan_info {
6436                     int aborted;
6437                     const int *freqs;
6438                     size_t num_freqs;
6439                     struct wpa_driver_scan_ssid ssids[WPAS_MAX_SCAN_SSIDS];
6440                     size_t num_ssids;
6441                     int external_scan;
6442                     int nl_scan_event;
6443                     u64 scan_start_tsf;
6444                     u8 scan_start_tsf_bssid[ETH_ALEN];
6445                     u64 scan_cookie;
6446           } scan_info;
6447 
6448           /**
6449            * struct rx_probe_req - Data for EVENT_RX_PROBE_REQ events
6450            */
6451           struct rx_probe_req {
6452                     /**
6453                      * sa - Source address of the received Probe Request frame
6454                      */
6455                     const u8 *sa;
6456 
6457                     /**
6458                      * da - Destination address of the received Probe Request frame
6459                      *        or %NULL if not available
6460                      */
6461                     const u8 *da;
6462 
6463                     /**
6464                      * bssid - BSSID of the received Probe Request frame or %NULL
6465                      *        if not available
6466                      */
6467                     const u8 *bssid;
6468 
6469                     /**
6470                      * ie - IEs from the Probe Request body
6471                      */
6472                     const u8 *ie;
6473 
6474                     /**
6475                      * ie_len - Length of ie buffer in octets
6476                      */
6477                     size_t ie_len;
6478 
6479                     /**
6480                      * signal - signal strength in dBm (or 0 if not available)
6481                      */
6482                     int ssi_signal;
6483           } rx_probe_req;
6484 
6485           /**
6486            * struct new_sta - Data for EVENT_NEW_STA events
6487            */
6488           struct new_sta {
6489                     const u8 *addr;
6490           } new_sta;
6491 
6492           /**
6493            * struct eapol_rx - Data for EVENT_EAPOL_RX events
6494            */
6495           struct eapol_rx {
6496                     const u8 *src;
6497                     const u8 *data;
6498                     size_t data_len;
6499                     enum frame_encryption encrypted;
6500                     int link_id;
6501           } eapol_rx;
6502 
6503           /**
6504            * signal_change - Data for EVENT_SIGNAL_CHANGE events
6505            */
6506           struct wpa_signal_info signal_change;
6507 
6508           /**
6509            * struct best_channel - Data for EVENT_BEST_CHANNEL events
6510            * @freq_24: Best 2.4 GHz band channel frequency in MHz
6511            * @freq_5: Best 5 GHz band channel frequency in MHz
6512            * @freq_overall: Best channel frequency in MHz
6513            *
6514            * 0 can be used to indicate no preference in either band.
6515            */
6516           struct best_channel {
6517                     int freq_24;
6518                     int freq_5;
6519                     int freq_overall;
6520           } best_chan;
6521 
6522           struct unprot_deauth {
6523                     const u8 *sa;
6524                     const u8 *da;
6525                     u16 reason_code;
6526           } unprot_deauth;
6527 
6528           struct unprot_disassoc {
6529                     const u8 *sa;
6530                     const u8 *da;
6531                     u16 reason_code;
6532           } unprot_disassoc;
6533 
6534           /**
6535            * struct low_ack - Data for EVENT_STATION_LOW_ACK events
6536            * @addr: station address
6537            * @num_packets: Number of packets lost (consecutive packets not
6538            * acknowledged)
6539            */
6540           struct low_ack {
6541                     u8 addr[ETH_ALEN];
6542                     u32 num_packets;
6543           } low_ack;
6544 
6545           /**
6546            * struct ibss_peer_lost - Data for EVENT_IBSS_PEER_LOST
6547            */
6548           struct ibss_peer_lost {
6549                     u8 peer[ETH_ALEN];
6550           } ibss_peer_lost;
6551 
6552           /**
6553            * struct driver_gtk_rekey - Data for EVENT_DRIVER_GTK_REKEY
6554            */
6555           struct driver_gtk_rekey {
6556                     const u8 *bssid;
6557                     const u8 *replay_ctr;
6558           } driver_gtk_rekey;
6559 
6560           /**
6561            * struct client_poll - Data for EVENT_DRIVER_CLIENT_POLL_OK events
6562            * @addr: station address
6563            */
6564           struct client_poll {
6565                     u8 addr[ETH_ALEN];
6566           } client_poll;
6567 
6568           /**
6569            * struct eapol_tx_status
6570            * @dst: Original destination
6571            * @data: Data starting with IEEE 802.1X header (!)
6572            * @data_len: Length of data
6573            * @ack: Indicates ack or lost frame
6574            * @link_id: MLD link id used to transmit the frame or -1 for non MLO
6575            *
6576            * This corresponds to hapd_send_eapol if the frame sent
6577            * there isn't just reported as EVENT_TX_STATUS.
6578            */
6579           struct eapol_tx_status {
6580                     const u8 *dst;
6581                     const u8 *data;
6582                     int data_len;
6583                     int ack;
6584                     int link_id;
6585           } eapol_tx_status;
6586 
6587           /**
6588            * struct ch_switch
6589            * @freq: Frequency of new channel in MHz
6590            * @ht_enabled: Whether this is an HT channel
6591            * @ch_offset: Secondary channel offset
6592            * @ch_width: Channel width
6593            * @cf1: Center frequency 1
6594            * @cf2: Center frequency 2
6595            * @link_id: Link ID of the MLO link
6596            * @punct_bitmap: Puncturing bitmap
6597            */
6598           struct ch_switch {
6599                     int freq;
6600                     int ht_enabled;
6601                     int ch_offset;
6602                     enum chan_width ch_width;
6603                     int cf1;
6604                     int cf2;
6605                     int link_id;
6606                     u16 punct_bitmap;
6607           } ch_switch;
6608 
6609           /**
6610            * struct connect_failed - Data for EVENT_CONNECT_FAILED_REASON
6611            * @addr: Remote client address
6612            * @code: Reason code for connection failure
6613            */
6614           struct connect_failed_reason {
6615                     u8 addr[ETH_ALEN];
6616                     enum {
6617                               MAX_CLIENT_REACHED,
6618                               BLOCKED_CLIENT
6619                     } code;
6620           } connect_failed_reason;
6621 
6622           /**
6623            * struct dfs_event - Data for radar detected events
6624            * @freq: Frequency of the channel in MHz
6625            * @link_id: If >= 0, Link ID of the MLO link
6626            */
6627           struct dfs_event {
6628                     int freq;
6629                     int ht_enabled;
6630                     int chan_offset;
6631                     enum chan_width chan_width;
6632                     int cf1;
6633                     int cf2;
6634                     int link_id;
6635           } dfs_event;
6636 
6637           /**
6638            * survey_results - Survey result data for EVENT_SURVEY
6639            * @freq_filter: Requested frequency survey filter, 0 if request
6640            *        was for all survey data
6641            * @survey_list: Linked list of survey data (struct freq_survey)
6642            */
6643           struct survey_results {
6644                     unsigned int freq_filter;
6645                     struct dl_list survey_list; /* struct freq_survey */
6646           } survey_results;
6647 
6648           /**
6649            * channel_list_changed - Data for EVENT_CHANNEL_LIST_CHANGED
6650            * @initiator: Initiator of the regulatory change
6651            * @type: Regulatory change type
6652            * @alpha2: Country code (or "" if not available)
6653            * @beacon_hint_before: Data for frequency attributes before beacon hint
6654            *        event if initiator == REGDOM_BEACON_HINT
6655            * @beacon_hint_after: Data for frequency attributes after beacon hint
6656            *        event if initiator == REGDOM_BEACON_HINT
6657            */
6658           struct channel_list_changed {
6659                     enum reg_change_initiator initiator;
6660                     enum reg_type type;
6661                     char alpha2[3];
6662                     struct frequency_attrs {
6663                               unsigned int freq;
6664                               unsigned int max_tx_power;
6665                               bool disabled;
6666                               bool no_ir;
6667                               bool radar;
6668                     } beacon_hint_before, beacon_hint_after;
6669           } channel_list_changed;
6670 
6671           /**
6672            * freq_range - List of frequency ranges
6673            *
6674            * This is used as the data with EVENT_AVOID_FREQUENCIES.
6675            */
6676           struct wpa_freq_range_list freq_range;
6677 
6678           /**
6679            * struct mesh_peer
6680            *
6681            * @peer: Peer address
6682            * @ies: Beacon IEs
6683            * @ie_len: Length of @ies
6684            *
6685            * Notification of new candidate mesh peer.
6686            */
6687           struct mesh_peer {
6688                     const u8 *peer;
6689                     const u8 *ies;
6690                     size_t ie_len;
6691           } mesh_peer;
6692 
6693           /**
6694            * struct acs_selected_channels - Data for EVENT_ACS_CHANNEL_SELECTED
6695            * @pri_freq: Selected primary frequency
6696            * @sec_freq: Selected secondary frequency
6697            * @edmg_channel: Selected EDMG channel
6698            * @vht_seg0_center_ch: VHT mode Segment0 center channel
6699            *        The value is the index of the channel center frequency for
6700            *        20 MHz, 40 MHz, and 80 MHz channels. The value is the center
6701            *        frequency index of the primary 80 MHz segment for 160 MHz and
6702            *        80+80 MHz channels.
6703            * @vht_seg1_center_ch: VHT mode Segment1 center channel
6704            *        The value is zero for 20 MHz, 40 MHz, and 80 MHz channels. The
6705            *        value is the index of the channel center frequency for 160 MHz
6706            *        channels and the center frequency index of the secondary 80 MHz
6707            *        segment for 80+80 MHz channels.
6708            * @ch_width: Selected Channel width by driver. Driver may choose to
6709            *        change hostapd configured ACS channel width due driver internal
6710            *        channel restrictions.
6711            * @hw_mode: Selected band (used with hw_mode=any)
6712            * @puncture_bitmap: Indicate the puncturing channels
6713            * @link_id: Indicate the link id if operating as AP MLD; -1 otherwise
6714            */
6715           struct acs_selected_channels {
6716                     unsigned int pri_freq;
6717                     unsigned int sec_freq;
6718                     u8 edmg_channel;
6719                     u8 vht_seg0_center_ch;
6720                     u8 vht_seg1_center_ch;
6721                     u16 ch_width;
6722                     enum hostapd_hw_mode hw_mode;
6723                     u16 puncture_bitmap;
6724                     int link_id;
6725           } acs_selected_channels;
6726 
6727           /**
6728            * struct p2p_lo_stop - Reason code for P2P Listen offload stop event
6729            * @reason_code: Reason for stopping offload
6730            *        P2P_LO_STOPPED_REASON_COMPLETE: Listen offload finished as
6731            *        scheduled.
6732            *        P2P_LO_STOPPED_REASON_RECV_STOP_CMD: Host requested offload to
6733            *        be stopped.
6734            *        P2P_LO_STOPPED_REASON_INVALID_PARAM: Invalid listen offload
6735            *        parameters.
6736            *        P2P_LO_STOPPED_REASON_NOT_SUPPORTED: Listen offload not
6737            *        supported by device.
6738            */
6739           struct p2p_lo_stop {
6740                     enum {
6741                               P2P_LO_STOPPED_REASON_COMPLETE = 0,
6742                               P2P_LO_STOPPED_REASON_RECV_STOP_CMD,
6743                               P2P_LO_STOPPED_REASON_INVALID_PARAM,
6744                               P2P_LO_STOPPED_REASON_NOT_SUPPORTED,
6745                     } reason_code;
6746           } p2p_lo_stop;
6747 
6748           /* For EVENT_EXTERNAL_AUTH */
6749           struct external_auth external_auth;
6750 
6751           /**
6752            * struct sta_opmode - Station's operation mode change event
6753            * @addr: The station MAC address
6754            * @smps_mode: SMPS mode of the station
6755            * @chan_width: Channel width of the station
6756            * @rx_nss: RX_NSS of the station
6757            *
6758            * This is used as data with EVENT_STATION_OPMODE_CHANGED.
6759            */
6760           struct sta_opmode {
6761                     const u8 *addr;
6762                     enum smps_mode smps_mode;
6763                     enum chan_width chan_width;
6764                     u8 rx_nss;
6765           } sta_opmode;
6766 
6767           /**
6768            * struct wds_sta_interface - Data for EVENT_WDS_STA_INTERFACE_STATUS.
6769            */
6770           struct wds_sta_interface {
6771                     const u8 *sta_addr;
6772                     const char *ifname;
6773                     enum {
6774                               INTERFACE_ADDED,
6775                               INTERFACE_REMOVED
6776                     } istatus;
6777           } wds_sta_interface;
6778 
6779           /**
6780            * struct update_dh - Data for EVENT_UPDATE_DH
6781            */
6782           struct update_dh {
6783                     const u8 *peer;
6784                     const u8 *ie;
6785                     size_t ie_len;
6786                     int assoc_link_id;
6787                     const u8 *link_addr;
6788           } update_dh;
6789 
6790           /**
6791            * struct unprot_beacon - Data for EVENT_UNPROT_BEACON
6792            */
6793           struct unprot_beacon {
6794                     const u8 *sa;
6795           } unprot_beacon;
6796 
6797           /**
6798            * struct bss_color_collision - Data for EVENT_BSS_COLOR_COLLISION
6799            */
6800           struct bss_color_collision {
6801                     u64 bitmap;
6802                     int link_id;
6803           } bss_color_collision;
6804 
6805           /**
6806            * struct pasn_auth - Data for EVENT_PASN_AUTH
6807            */
6808           struct pasn_auth pasn_auth;
6809 
6810           /**
6811            * struct port_authorized - Data for EVENT_PORT_AUTHORIZED
6812            * @td_bitmap: For STA mode, transition disable bitmap, if received in
6813            *        EAPOL-Key msg 3/4
6814            * @td_bitmap_len: For STA mode, length of td_bitmap
6815            * @sta_addr: For AP mode, the MAC address of the associated STA
6816            *
6817            * This event is used to indicate that the port is authorized and
6818            * open for normal data in STA and AP modes when 4-way handshake is
6819            * offloaded to the driver.
6820            */
6821           struct port_authorized {
6822                     const u8 *td_bitmap;
6823                     size_t td_bitmap_len;
6824                     const u8 *sta_addr;
6825           } port_authorized;
6826 
6827           /**
6828            * struct tid_link_map_info - Data for EVENT_TID_LINK_MAP
6829            */
6830           struct tid_link_map_info {
6831                     bool default_map;
6832                     u8 valid_links;
6833                     struct t2lm_mapping t2lmap[MAX_NUM_MLD_LINKS];
6834           } t2l_map_info;
6835 };
6836 
6837 /**
6838  * wpa_supplicant_event - Report a driver event for wpa_supplicant
6839  * @ctx: Context pointer (wpa_s); this is the ctx variable registered
6840  *        with struct wpa_driver_ops::init()
6841  * @event: event type (defined above)
6842  * @data: possible extra data for the event
6843  *
6844  * Driver wrapper code should call this function whenever an event is received
6845  * from the driver.
6846  */
6847 void wpa_supplicant_event(void *ctx, enum wpa_event_type event,
6848                                 union wpa_event_data *data);
6849 
6850 /**
6851  * wpa_supplicant_event_global - Report a driver event for wpa_supplicant
6852  * @ctx: Context pointer (wpa_s); this is the ctx variable registered
6853  *        with struct wpa_driver_ops::init()
6854  * @event: event type (defined above)
6855  * @data: possible extra data for the event
6856  *
6857  * Same as wpa_supplicant_event(), but we search for the interface in
6858  * wpa_global.
6859  */
6860 void wpa_supplicant_event_global(void *ctx, enum wpa_event_type event,
6861                                          union wpa_event_data *data);
6862 
6863 /*
6864  * The following inline functions are provided for convenience to simplify
6865  * event indication for some of the common events.
6866  */
6867 
drv_event_assoc(void * ctx,const u8 * addr,const u8 * req_ies,size_t req_ielen,const u8 * resp_ies,size_t resp_ielen,const u8 * link_addr,int assoc_link_id,int reassoc)6868 static inline void drv_event_assoc(void *ctx, const u8 *addr, const u8 *req_ies,
6869                                            size_t req_ielen, const u8 *resp_ies,
6870                                            size_t resp_ielen, const u8 *link_addr,
6871                                            int assoc_link_id, int reassoc)
6872 {
6873           union wpa_event_data event;
6874           os_memset(&event, 0, sizeof(event));
6875           event.assoc_info.reassoc = reassoc;
6876           event.assoc_info.req_ies = req_ies;
6877           event.assoc_info.req_ies_len = req_ielen;
6878           event.assoc_info.resp_ies = resp_ies;
6879           event.assoc_info.resp_ies_len = resp_ielen;
6880           event.assoc_info.addr = addr;
6881           event.assoc_info.link_addr = link_addr;
6882           event.assoc_info.assoc_link_id = assoc_link_id;
6883           wpa_supplicant_event(ctx, EVENT_ASSOC, &event);
6884 }
6885 
drv_event_disassoc(void * ctx,const u8 * addr)6886 static inline void drv_event_disassoc(void *ctx, const u8 *addr)
6887 {
6888           union wpa_event_data event;
6889           os_memset(&event, 0, sizeof(event));
6890           event.disassoc_info.addr = addr;
6891           wpa_supplicant_event(ctx, EVENT_DISASSOC, &event);
6892 }
6893 
drv_event_eapol_rx(void * ctx,const u8 * src,const u8 * data,size_t data_len)6894 static inline void drv_event_eapol_rx(void *ctx, const u8 *src, const u8 *data,
6895                                               size_t data_len)
6896 {
6897           union wpa_event_data event;
6898           os_memset(&event, 0, sizeof(event));
6899           event.eapol_rx.src = src;
6900           event.eapol_rx.data = data;
6901           event.eapol_rx.data_len = data_len;
6902           event.eapol_rx.encrypted = FRAME_ENCRYPTION_UNKNOWN;
6903           event.eapol_rx.link_id = -1;
6904           wpa_supplicant_event(ctx, EVENT_EAPOL_RX, &event);
6905 }
6906 
drv_event_eapol_rx2(void * ctx,const u8 * src,const u8 * data,size_t data_len,enum frame_encryption encrypted,int link_id)6907 static inline void drv_event_eapol_rx2(void *ctx, const u8 *src, const u8 *data,
6908                                                size_t data_len,
6909                                                enum frame_encryption encrypted,
6910                                                int link_id)
6911 {
6912           union wpa_event_data event;
6913           os_memset(&event, 0, sizeof(event));
6914           event.eapol_rx.src = src;
6915           event.eapol_rx.data = data;
6916           event.eapol_rx.data_len = data_len;
6917           event.eapol_rx.encrypted = encrypted;
6918           event.eapol_rx.link_id = link_id;
6919           wpa_supplicant_event(ctx, EVENT_EAPOL_RX, &event);
6920 }
6921 
6922 /* driver_common.c */
6923 void wpa_scan_results_free(struct wpa_scan_results *res);
6924 
6925 /* Convert wpa_event_type to a string for logging */
6926 const char * event_to_string(enum wpa_event_type event);
6927 
6928 /* Convert chan_width to a string for logging and control interfaces */
6929 const char * channel_width_to_string(enum chan_width width);
6930 
6931 int channel_width_to_int(enum chan_width width);
6932 
6933 int ht_supported(const struct hostapd_hw_modes *mode);
6934 int vht_supported(const struct hostapd_hw_modes *mode);
6935 bool he_supported(const struct hostapd_hw_modes *hw_mode,
6936                       enum ieee80211_op_mode op_mode);
6937 
6938 struct wowlan_triggers *
6939 wpa_get_wowlan_triggers(const char *wowlan_triggers,
6940                               const struct wpa_driver_capa *capa);
6941 /* Convert driver flag to string */
6942 const char * driver_flag_to_string(u64 flag);
6943 const char * driver_flag2_to_string(u64 flag2);
6944 
6945 /* NULL terminated array of linked in driver wrappers */
6946 extern const struct wpa_driver_ops *const wpa_drivers[];
6947 
6948 
6949 /* Available drivers */
6950 
6951 #ifdef CONFIG_DRIVER_WEXT
6952 extern const struct wpa_driver_ops wpa_driver_wext_ops; /* driver_wext.c */
6953 #endif /* CONFIG_DRIVER_WEXT */
6954 #ifdef CONFIG_DRIVER_NL80211
6955 /* driver_nl80211.c */
6956 extern const struct wpa_driver_ops wpa_driver_nl80211_ops;
6957 #endif /* CONFIG_DRIVER_NL80211 */
6958 #ifdef CONFIG_DRIVER_HOSTAP
6959 extern const struct wpa_driver_ops wpa_driver_hostap_ops; /* driver_hostap.c */
6960 #endif /* CONFIG_DRIVER_HOSTAP */
6961 #ifdef CONFIG_DRIVER_BSD
6962 extern const struct wpa_driver_ops wpa_driver_bsd_ops; /* driver_bsd.c */
6963 #endif /* CONFIG_DRIVER_BSD */
6964 #ifdef CONFIG_DRIVER_OPENBSD
6965 /* driver_openbsd.c */
6966 extern const struct wpa_driver_ops wpa_driver_openbsd_ops;
6967 #endif /* CONFIG_DRIVER_OPENBSD */
6968 #ifdef CONFIG_DRIVER_NDIS
6969 extern struct wpa_driver_ops wpa_driver_ndis_ops; /* driver_ndis.c */
6970 #endif /* CONFIG_DRIVER_NDIS */
6971 #ifdef CONFIG_DRIVER_WIRED
6972 extern const struct wpa_driver_ops wpa_driver_wired_ops; /* driver_wired.c */
6973 #endif /* CONFIG_DRIVER_WIRED */
6974 #ifdef CONFIG_DRIVER_MACSEC_QCA
6975 /* driver_macsec_qca.c */
6976 extern const struct wpa_driver_ops wpa_driver_macsec_qca_ops;
6977 #endif /* CONFIG_DRIVER_MACSEC_QCA */
6978 #ifdef CONFIG_DRIVER_MACSEC_LINUX
6979 /* driver_macsec_linux.c */
6980 extern const struct wpa_driver_ops wpa_driver_macsec_linux_ops;
6981 #endif /* CONFIG_DRIVER_MACSEC_LINUX */
6982 #ifdef CONFIG_DRIVER_ROBOSWITCH
6983 /* driver_roboswitch.c */
6984 extern const struct wpa_driver_ops wpa_driver_roboswitch_ops;
6985 #endif /* CONFIG_DRIVER_ROBOSWITCH */
6986 #ifdef CONFIG_DRIVER_ATHEROS
6987 /* driver_atheros.c */
6988 extern const struct wpa_driver_ops wpa_driver_atheros_ops;
6989 #endif /* CONFIG_DRIVER_ATHEROS */
6990 #ifdef CONFIG_DRIVER_NONE
6991 extern const struct wpa_driver_ops wpa_driver_none_ops; /* driver_none.c */
6992 #endif /* CONFIG_DRIVER_NONE */
6993 
6994 #endif /* DRIVER_H */
6995