1 /*
2 * hostapd / Initialization and configuration
3 * Copyright (c) 2002-2014, 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
9 #ifndef HOSTAPD_H
10 #define HOSTAPD_H
11
12 #ifdef CONFIG_SQLITE
13 #include <sqlite3.h>
14 #endif /* CONFIG_SQLITE */
15
16 #include "common/defs.h"
17 #include "common/dpp.h"
18 #include "utils/list.h"
19 #include "ap_config.h"
20 #include "drivers/driver.h"
21
22 #define OCE_STA_CFON_ENABLED(hapd) \
23 ((hapd->conf->oce & OCE_STA_CFON) && \
24 (hapd->iface->drv_flags & WPA_DRIVER_FLAGS_OCE_STA_CFON))
25 #define OCE_AP_ENABLED(hapd) \
26 ((hapd->conf->oce & OCE_AP) && \
27 (hapd->iface->drv_flags & WPA_DRIVER_FLAGS_OCE_AP))
28
29 struct wpa_ctrl_dst;
30 struct radius_server_data;
31 struct upnp_wps_device_sm;
32 struct hostapd_data;
33 struct sta_info;
34 struct ieee80211_ht_capabilities;
35 struct full_dynamic_vlan;
36 enum wps_event;
37 union wps_event_data;
38 #ifdef CONFIG_MESH
39 struct mesh_conf;
40 #endif /* CONFIG_MESH */
41
42 #ifdef CONFIG_CTRL_IFACE_UDP
43 #define CTRL_IFACE_COOKIE_LEN 8
44 #endif /* CONFIG_CTRL_IFACE_UDP */
45
46 struct hostapd_iface;
47 struct hostapd_mld;
48
49 struct hapd_interfaces {
50 int (*reload_config)(struct hostapd_iface *iface);
51 struct hostapd_config * (*config_read_cb)(const char *config_fname);
52 int (*ctrl_iface_init)(struct hostapd_data *hapd);
53 void (*ctrl_iface_deinit)(struct hostapd_data *hapd);
54 int (*for_each_interface)(struct hapd_interfaces *interfaces,
55 int (*cb)(struct hostapd_iface *iface,
56 void *ctx), void *ctx);
57 int (*driver_init)(struct hostapd_iface *iface);
58
59 size_t count;
60 int global_ctrl_sock;
61 struct dl_list global_ctrl_dst;
62 char *global_iface_path;
63 char *global_iface_name;
64 #ifndef CONFIG_NATIVE_WINDOWS
65 gid_t ctrl_iface_group;
66 #endif /* CONFIG_NATIVE_WINDOWS */
67 struct hostapd_iface **iface;
68
69 size_t terminate_on_error;
70 #ifndef CONFIG_NO_VLAN
71 struct dynamic_iface *vlan_priv;
72 #endif /* CONFIG_NO_VLAN */
73 #ifdef CONFIG_ETH_P_OUI
74 struct dl_list eth_p_oui; /* OUI Extended EtherType handlers */
75 #endif /* CONFIG_ETH_P_OUI */
76 int eloop_initialized;
77
78 #ifdef CONFIG_DPP
79 struct dpp_global *dpp;
80 #ifdef CONFIG_DPP3
81 struct os_reltime dpp_pb_time;
82 struct os_reltime dpp_pb_announce_time;
83 struct dpp_pb_info dpp_pb[DPP_PB_INFO_COUNT];
84 struct dpp_bootstrap_info *dpp_pb_bi;
85 u8 dpp_pb_c_nonce[DPP_MAX_NONCE_LEN];
86 u8 dpp_pb_resp_hash[SHA256_MAC_LEN];
87 struct os_reltime dpp_pb_last_resp;
88 bool dpp_pb_result_indicated;
89 char *dpp_pb_cmd;
90 #endif /* CONFIG_DPP3 */
91 #endif /* CONFIG_DPP */
92
93 #ifdef CONFIG_CTRL_IFACE_UDP
94 unsigned char ctrl_iface_cookie[CTRL_IFACE_COOKIE_LEN];
95 #endif /* CONFIG_CTRL_IFACE_UDP */
96
97 #ifdef CONFIG_IEEE80211BE
98 struct hostapd_mld **mld;
99 size_t mld_count;
100 int (*mld_ctrl_iface_init)(struct hostapd_mld *mld);
101 void (*mld_ctrl_iface_deinit)(struct hostapd_mld *mld);
102 #endif /* CONFIG_IEEE80211BE */
103 };
104
105 enum hostapd_chan_status {
106 HOSTAPD_CHAN_VALID = 0, /* channel is ready */
107 HOSTAPD_CHAN_INVALID = 1, /* no usable channel found */
108 HOSTAPD_CHAN_ACS = 2, /* ACS work being performed */
109 HOSTAPD_CHAN_INVALID_NO_IR = 3, /* channel invalid due to AFC NO IR */
110 };
111
112 struct hostapd_probereq_cb {
113 int (*cb)(void *ctx, const u8 *sa, const u8 *da, const u8 *bssid,
114 const u8 *ie, size_t ie_len, int ssi_signal);
115 void *ctx;
116 };
117
118 #define HOSTAPD_RATE_BASIC 0x00000001
119
120 struct hostapd_rate_data {
121 int rate; /* rate in 100 kbps */
122 int flags; /* HOSTAPD_RATE_ flags */
123 };
124
125 struct hostapd_frame_info {
126 unsigned int freq;
127 u32 channel;
128 u32 datarate;
129 int ssi_signal; /* dBm */
130 };
131
132 enum wps_status {
133 WPS_STATUS_SUCCESS = 1,
134 WPS_STATUS_FAILURE
135 };
136
137 enum pbc_status {
138 WPS_PBC_STATUS_DISABLE,
139 WPS_PBC_STATUS_ACTIVE,
140 WPS_PBC_STATUS_TIMEOUT,
141 WPS_PBC_STATUS_OVERLAP
142 };
143
144 struct wps_stat {
145 enum wps_status status;
146 enum wps_error_indication failure_reason;
147 enum pbc_status pbc_status;
148 u8 peer_addr[ETH_ALEN];
149 };
150
151 struct hostapd_neighbor_entry {
152 struct dl_list list;
153 u8 bssid[ETH_ALEN];
154 struct wpa_ssid_value ssid;
155 struct wpabuf *nr;
156 struct wpabuf *lci;
157 struct wpabuf *civic;
158 /* LCI update time */
159 struct os_time lci_date;
160 int stationary;
161 u32 short_ssid;
162 u8 bss_parameters;
163 };
164
165 struct hostapd_sae_commit_queue {
166 struct dl_list list;
167 int rssi;
168 size_t len;
169 u8 msg[];
170 };
171
172 struct mld_link_info {
173 u8 valid:1;
174 u8 nstr_bitmap_len:2;
175 u8 local_addr[ETH_ALEN];
176 u8 peer_addr[ETH_ALEN];
177
178 u8 nstr_bitmap[2];
179
180 u16 capability;
181
182 u16 status;
183 u16 resp_sta_profile_len;
184 u8 *resp_sta_profile;
185 };
186
187 /**
188 * struct hostapd_data - hostapd per-BSS data structure
189 */
190 struct hostapd_data {
191 struct hostapd_iface *iface;
192 struct hostapd_config *iconf;
193 struct hostapd_bss_config *conf;
194 int interface_added; /* virtual interface added for this BSS */
195 unsigned int started:1;
196 unsigned int disabled:1;
197 unsigned int reenable_beacon:1;
198
199 u8 own_addr[ETH_ALEN];
200
201 int num_sta; /* number of entries in sta_list */
202 struct sta_info *sta_list; /* STA info list head */
203 #define STA_HASH_SIZE 256
204 #define STA_HASH(sta) (sta[5])
205 struct sta_info *sta_hash[STA_HASH_SIZE];
206
207 /*
208 * Bitfield for indicating which AIDs are allocated. Only AID values
209 * 1-2007 are used and as such, the bit at index 0 corresponds to AID
210 * 1.
211 */
212 #define AID_WORDS ((2008 + 31) / 32)
213 u32 sta_aid[AID_WORDS];
214
215 const struct wpa_driver_ops *driver;
216 void *drv_priv;
217
218 void (*new_assoc_sta_cb)(struct hostapd_data *hapd,
219 struct sta_info *sta, int reassoc);
220
221 void *msg_ctx; /* ctx for wpa_msg() calls */
222 void *msg_ctx_parent; /* parent interface ctx for wpa_msg() calls */
223
224 struct radius_client_data *radius;
225 u64 acct_session_id;
226 struct radius_das_data *radius_das;
227
228 struct hostapd_cached_radius_acl *acl_cache;
229 struct hostapd_acl_query_data *acl_queries;
230
231 struct wpa_authenticator *wpa_auth;
232 struct eapol_authenticator *eapol_auth;
233 struct eap_config *eap_cfg;
234
235 struct rsn_preauth_interface *preauth_iface;
236 struct os_reltime michael_mic_failure;
237 int michael_mic_failures;
238 int tkip_countermeasures;
239
240 int ctrl_sock;
241 struct dl_list ctrl_dst;
242
243 void *ssl_ctx;
244 void *eap_sim_db_priv;
245 struct crypto_rsa_key *imsi_privacy_key;
246 struct radius_server_data *radius_srv;
247 struct dl_list erp_keys; /* struct eap_server_erp_key */
248
249 int parameter_set_count;
250
251 /* Time Advertisement */
252 u8 time_update_counter;
253 struct wpabuf *time_adv;
254
255 #ifdef CONFIG_FULL_DYNAMIC_VLAN
256 struct full_dynamic_vlan *full_dynamic_vlan;
257 #endif /* CONFIG_FULL_DYNAMIC_VLAN */
258
259 struct l2_packet_data *l2;
260
261 #ifdef CONFIG_IEEE80211R_AP
262 struct dl_list l2_queue;
263 struct dl_list l2_oui_queue;
264 struct eth_p_oui_ctx *oui_pull;
265 struct eth_p_oui_ctx *oui_resp;
266 struct eth_p_oui_ctx *oui_push;
267 struct eth_p_oui_ctx *oui_sreq;
268 struct eth_p_oui_ctx *oui_sresp;
269 #endif /* CONFIG_IEEE80211R_AP */
270
271 struct wps_context *wps;
272
273 int beacon_set_done;
274 struct wpabuf *wps_beacon_ie;
275 struct wpabuf *wps_probe_resp_ie;
276 #ifdef CONFIG_WPS
277 unsigned int ap_pin_failures;
278 unsigned int ap_pin_failures_consecutive;
279 struct upnp_wps_device_sm *wps_upnp;
280 unsigned int ap_pin_lockout_time;
281
282 struct wps_stat wps_stats;
283 #endif /* CONFIG_WPS */
284
285 #ifdef CONFIG_MACSEC
286 struct ieee802_1x_kay *kay;
287 #endif /* CONFIG_MACSEC */
288
289 struct hostapd_probereq_cb *probereq_cb;
290 size_t num_probereq_cb;
291
292 void (*public_action_cb)(void *ctx, const u8 *buf, size_t len,
293 int freq);
294 void *public_action_cb_ctx;
295 void (*public_action_cb2)(void *ctx, const u8 *buf, size_t len,
296 int freq);
297 void *public_action_cb2_ctx;
298
299 int (*vendor_action_cb)(void *ctx, const u8 *buf, size_t len,
300 int freq);
301 void *vendor_action_cb_ctx;
302
303 void (*wps_reg_success_cb)(void *ctx, const u8 *mac_addr,
304 const u8 *uuid_e);
305 void *wps_reg_success_cb_ctx;
306
307 void (*wps_event_cb)(void *ctx, enum wps_event event,
308 union wps_event_data *data);
309 void *wps_event_cb_ctx;
310
311 void (*sta_authorized_cb)(void *ctx, const u8 *mac_addr,
312 int authorized, const u8 *p2p_dev_addr,
313 const u8 *ip);
314 void *sta_authorized_cb_ctx;
315
316 void (*setup_complete_cb)(void *ctx);
317 void *setup_complete_cb_ctx;
318
319 void (*new_psk_cb)(void *ctx, const u8 *mac_addr,
320 const u8 *p2p_dev_addr, const u8 *psk,
321 size_t psk_len);
322 void *new_psk_cb_ctx;
323
324 /* channel switch parameters */
325 struct hostapd_freq_params cs_freq_params;
326 u8 cs_count;
327 int cs_block_tx;
328 unsigned int cs_c_off_beacon;
329 unsigned int cs_c_off_proberesp;
330 int csa_in_progress;
331 unsigned int cs_c_off_ecsa_beacon;
332 unsigned int cs_c_off_ecsa_proberesp;
333
334 #ifdef CONFIG_IEEE80211AX
335 bool cca_in_progress;
336 u8 cca_count;
337 u8 cca_color;
338 unsigned int cca_c_off_beacon;
339 unsigned int cca_c_off_proberesp;
340 struct os_reltime first_color_collision;
341 struct os_reltime last_color_collision;
342 u64 color_collision_bitmap;
343 #endif /* CONFIG_IEEE80211AX */
344
345 #ifdef CONFIG_P2P
346 struct p2p_data *p2p;
347 struct p2p_group *p2p_group;
348 struct wpabuf *p2p_beacon_ie;
349 struct wpabuf *p2p_probe_resp_ie;
350
351 /* Number of non-P2P association stations */
352 int num_sta_no_p2p;
353
354 /* Periodic NoA (used only when no non-P2P clients in the group) */
355 int noa_enabled;
356 int noa_start;
357 int noa_duration;
358 #endif /* CONFIG_P2P */
359 #ifdef CONFIG_PROXYARP
360 struct l2_packet_data *sock_dhcp;
361 struct l2_packet_data *sock_ndisc;
362 bool x_snoop_initialized;
363 #endif /* CONFIG_PROXYARP */
364 #ifdef CONFIG_MESH
365 int num_plinks;
366 int max_plinks;
367 void (*mesh_sta_free_cb)(struct hostapd_data *hapd,
368 struct sta_info *sta);
369 struct wpabuf *mesh_pending_auth;
370 struct os_reltime mesh_pending_auth_time;
371 u8 mesh_required_peer[ETH_ALEN];
372 #endif /* CONFIG_MESH */
373
374 #ifdef CONFIG_SQLITE
375 struct hostapd_eap_user tmp_eap_user;
376 #endif /* CONFIG_SQLITE */
377
378 #ifdef CONFIG_SAE
379
380 #define COMEBACK_KEY_SIZE 8
381 #define COMEBACK_PENDING_IDX_SIZE 256
382
383 /** Key used for generating SAE anti-clogging tokens */
384 u8 comeback_key[COMEBACK_KEY_SIZE];
385 struct os_reltime last_comeback_key_update;
386 u16 comeback_idx;
387 u16 comeback_pending_idx[COMEBACK_PENDING_IDX_SIZE];
388 int dot11RSNASAERetransPeriod; /* msec */
389 struct dl_list sae_commit_queue; /* struct hostapd_sae_commit_queue */
390 #endif /* CONFIG_SAE */
391
392 #ifdef CONFIG_TESTING_OPTIONS
393 unsigned int ext_mgmt_frame_handling:1;
394 unsigned int ext_eapol_frame_io:1;
395
396 struct l2_packet_data *l2_test;
397
398 enum wpa_alg last_gtk_alg;
399 int last_gtk_key_idx;
400 u8 last_gtk[WPA_GTK_MAX_LEN];
401 size_t last_gtk_len;
402
403 enum wpa_alg last_igtk_alg;
404 int last_igtk_key_idx;
405 u8 last_igtk[WPA_IGTK_MAX_LEN];
406 size_t last_igtk_len;
407
408 enum wpa_alg last_bigtk_alg;
409 int last_bigtk_key_idx;
410 u8 last_bigtk[WPA_BIGTK_MAX_LEN];
411 size_t last_bigtk_len;
412
413 bool force_backlog_bytes;
414 #endif /* CONFIG_TESTING_OPTIONS */
415
416 #ifdef CONFIG_MBO
417 unsigned int mbo_assoc_disallow;
418 #endif /* CONFIG_MBO */
419
420 struct dl_list nr_db;
421
422 u8 beacon_req_token;
423 u8 lci_req_token;
424 u8 range_req_token;
425 u8 link_measurement_req_token;
426 unsigned int lci_req_active:1;
427 unsigned int range_req_active:1;
428 unsigned int link_mesr_req_active:1;
429
430 int dhcp_sock; /* UDP socket used with the DHCP server */
431
432 struct ptksa_cache *ptksa;
433
434 #ifdef CONFIG_DPP
435 int dpp_init_done;
436 struct dpp_authentication *dpp_auth;
437 u8 dpp_allowed_roles;
438 int dpp_qr_mutual;
439 int dpp_auth_ok_on_ack;
440 int dpp_in_response_listen;
441 struct gas_query_ap *gas;
442 struct dpp_pkex *dpp_pkex;
443 struct dpp_bootstrap_info *dpp_pkex_bi;
444 char *dpp_pkex_code;
445 size_t dpp_pkex_code_len;
446 char *dpp_pkex_identifier;
447 enum dpp_pkex_ver dpp_pkex_ver;
448 char *dpp_pkex_auth_cmd;
449 char *dpp_configurator_params;
450 struct os_reltime dpp_last_init;
451 struct os_reltime dpp_init_iter_start;
452 unsigned int dpp_init_max_tries;
453 unsigned int dpp_init_retry_time;
454 unsigned int dpp_resp_wait_time;
455 unsigned int dpp_resp_max_tries;
456 unsigned int dpp_resp_retry_time;
457 #ifdef CONFIG_DPP2
458 struct wpabuf *dpp_presence_announcement;
459 struct dpp_bootstrap_info *dpp_chirp_bi;
460 int dpp_chirp_freq;
461 int *dpp_chirp_freqs;
462 int dpp_chirp_iter;
463 int dpp_chirp_round;
464 int dpp_chirp_scan_done;
465 int dpp_chirp_listen;
466 struct os_reltime dpp_relay_last_needs_ctrl;
467 #endif /* CONFIG_DPP2 */
468 #ifdef CONFIG_TESTING_OPTIONS
469 char *dpp_config_obj_override;
470 char *dpp_discovery_override;
471 char *dpp_groups_override;
472 unsigned int dpp_ignore_netaccesskey_mismatch:1;
473 #endif /* CONFIG_TESTING_OPTIONS */
474 #endif /* CONFIG_DPP */
475
476 #ifdef CONFIG_AIRTIME_POLICY
477 unsigned int num_backlogged_sta;
478 unsigned int airtime_weight;
479 #endif /* CONFIG_AIRTIME_POLICY */
480
481 u8 last_1x_eapol_key_replay_counter[8];
482
483 #ifdef CONFIG_SQLITE
484 sqlite3 *rad_attr_db;
485 #endif /* CONFIG_SQLITE */
486
487 #ifdef CONFIG_CTRL_IFACE_UDP
488 unsigned char ctrl_iface_cookie[CTRL_IFACE_COOKIE_LEN];
489 #endif /* CONFIG_CTRL_IFACE_UDP */
490
491 #ifdef CONFIG_IEEE80211BE
492 u8 eht_mld_bss_param_change;
493 struct hostapd_mld *mld;
494 struct dl_list link;
495 u8 mld_link_id;
496
497 /* Cached partner info for ML probe response */
498 struct mld_link_info partner_links[MAX_NUM_MLD_LINKS];
499
500 /* 5 characters for "_link", up to 2 characters for <link ID>, so in
501 * total, additional 7 characters required. */
502 char ctrl_sock_iface[IFNAMSIZ + 7 + 1];
503
504 #ifdef CONFIG_TESTING_OPTIONS
505 u8 eht_mld_link_removal_count;
506 #endif /* CONFIG_TESTING_OPTIONS */
507 #endif /* CONFIG_IEEE80211BE */
508
509 #ifdef CONFIG_NAN_USD
510 struct nan_de *nan_de;
511 #endif /* CONFIG_NAN_USD */
512
513 u64 scan_cookie; /* Scan instance identifier for the ongoing HT40 scan
514 */
515 };
516
517
518 struct hostapd_sta_info {
519 struct dl_list list;
520 u8 addr[ETH_ALEN];
521 struct os_reltime last_seen;
522 int ssi_signal;
523 #ifdef CONFIG_TAXONOMY
524 struct wpabuf *probe_ie_taxonomy;
525 #endif /* CONFIG_TAXONOMY */
526 };
527
528 #ifdef CONFIG_IEEE80211BE
529 /**
530 * struct hostapd_mld - hostapd per-mld data structure
531 */
532 struct hostapd_mld {
533 char name[IFNAMSIZ + 1];
534 u8 mld_addr[ETH_ALEN];
535 u8 next_link_id;
536 u8 num_links;
537 /* Number of hostapd_data (hapd) referencing this. num_links cannot be
538 * used since num_links can go to 0 even when a BSS is disabled and
539 * when it is re-enabled, the MLD should exist and hence it cannot be
540 * freed when num_links is 0.
541 */
542 u8 refcount;
543
544 struct hostapd_data *fbss;
545 struct dl_list links; /* List head of all affiliated links */
546
547 int ctrl_sock;
548 struct dl_list ctrl_dst;
549 char *ctrl_interface; /* Directory for UNIX domain sockets */
550 };
551
552 #define HOSTAPD_MLD_MAX_REF_COUNT 0xFF
553 #endif /* CONFIG_IEEE80211BE */
554
555 /**
556 * struct hostapd_iface - hostapd per-interface data structure
557 */
558 struct hostapd_iface {
559 struct hapd_interfaces *interfaces;
560 void *owner;
561 char *config_fname;
562 struct hostapd_config *conf;
563 char phy[16]; /* Name of the PHY (radio) */
564
565 enum hostapd_iface_state {
566 HAPD_IFACE_UNINITIALIZED,
567 HAPD_IFACE_DISABLED,
568 HAPD_IFACE_COUNTRY_UPDATE,
569 HAPD_IFACE_ACS,
570 HAPD_IFACE_HT_SCAN,
571 HAPD_IFACE_DFS,
572 HAPD_IFACE_NO_IR,
573 HAPD_IFACE_ENABLED
574 } state;
575
576 #ifdef CONFIG_MESH
577 struct mesh_conf *mconf;
578 #endif /* CONFIG_MESH */
579
580 size_t num_bss;
581 struct hostapd_data **bss;
582
583 unsigned int wait_channel_update:1;
584 unsigned int cac_started:1;
585 #ifdef CONFIG_FST
586 struct fst_iface *fst;
587 const struct wpabuf *fst_ies;
588 #endif /* CONFIG_FST */
589
590 /*
591 * When set, indicates that the driver will handle the AP
592 * teardown: delete global keys, station keys, and stations.
593 */
594 unsigned int driver_ap_teardown:1;
595
596 /*
597 * When set, indicates that this interface is part of list of
598 * interfaces that need to be started together (synchronously).
599 */
600 unsigned int need_to_start_in_sync:1;
601
602 /* Ready to start but waiting for other interfaces to become ready. */
603 unsigned int ready_to_start_in_sync:1;
604
605 int num_ap; /* number of entries in ap_list */
606 struct ap_info *ap_list; /* AP info list head */
607 struct ap_info *ap_hash[STA_HASH_SIZE];
608
609 u64 drv_flags;
610 u64 drv_flags2;
611 unsigned int drv_rrm_flags;
612
613 /*
614 * A bitmap of supported protocols for probe response offload. See
615 * struct wpa_driver_capa in driver.h
616 */
617 unsigned int probe_resp_offloads;
618
619 /* extended capabilities supported by the driver */
620 const u8 *extended_capa, *extended_capa_mask;
621 unsigned int extended_capa_len;
622
623 u16 mld_eml_capa, mld_mld_capa;
624
625 unsigned int drv_max_acl_mac_addrs;
626
627 struct hostapd_hw_modes *hw_features;
628 int num_hw_features;
629 struct hostapd_hw_modes *current_mode;
630 /* Rates that are currently used (i.e., filtered copy of
631 * current_mode->channels */
632 int num_rates;
633 struct hostapd_rate_data *current_rates;
634 int *basic_rates;
635 int freq;
636
637 bool radar_detected;
638
639 /* Background radar configuration */
640 struct {
641 int channel;
642 int secondary_channel;
643 int freq;
644 int centr_freq_seg0_idx;
645 int centr_freq_seg1_idx;
646 /* Main chain is on temporary channel during
647 * CAC detection on radar offchain.
648 */
649 unsigned int temp_ch:1;
650 /* CAC started on radar offchain */
651 unsigned int cac_started:1;
652 } radar_background;
653
654 u16 hw_flags;
655
656 /* Number of associated Non-ERP stations (i.e., stations using 802.11b
657 * in 802.11g BSS) */
658 int num_sta_non_erp;
659
660 /* Number of associated stations that do not support Short Slot Time */
661 int num_sta_no_short_slot_time;
662
663 /* Number of associated stations that do not support Short Preamble */
664 int num_sta_no_short_preamble;
665
666 int olbc; /* Overlapping Legacy BSS Condition */
667
668 /* Number of HT associated stations that do not support greenfield */
669 int num_sta_ht_no_gf;
670
671 /* Number of associated non-HT stations */
672 int num_sta_no_ht;
673
674 /* Number of HT associated stations 20 MHz */
675 int num_sta_ht_20mhz;
676
677 /* Number of HT40 intolerant stations */
678 int num_sta_ht40_intolerant;
679
680 /* Overlapping BSS information */
681 int olbc_ht;
682
683 u16 ht_op_mode;
684
685 /* surveying helpers */
686
687 /* number of channels surveyed */
688 unsigned int chans_surveyed;
689
690 /* lowest observed noise floor in dBm */
691 s8 lowest_nf;
692
693 /* channel utilization calculation */
694 u64 last_channel_time;
695 u64 last_channel_time_busy;
696 u8 channel_utilization;
697
698 unsigned int chan_util_samples_sum;
699 unsigned int chan_util_num_sample_periods;
700 unsigned int chan_util_average;
701
702 /* eCSA IE will be added only if operating class is specified */
703 u8 cs_oper_class;
704
705 unsigned int dfs_cac_ms;
706 struct os_reltime dfs_cac_start;
707
708 /* Latched with the actual secondary channel information and will be
709 * used while juggling between HT20 and HT40 modes. */
710 int secondary_ch;
711
712 #ifdef CONFIG_ACS
713 unsigned int acs_num_completed_scans;
714 unsigned int acs_num_retries;
715 #endif /* CONFIG_ACS */
716
717 void (*scan_cb)(struct hostapd_iface *iface);
718 int num_ht40_scan_tries;
719
720 struct dl_list sta_seen; /* struct hostapd_sta_info */
721 unsigned int num_sta_seen;
722
723 u8 dfs_domain;
724 #ifdef CONFIG_AIRTIME_POLICY
725 unsigned int airtime_quantum;
726 #endif /* CONFIG_AIRTIME_POLICY */
727
728 /* Previous WMM element information */
729 struct hostapd_wmm_ac_params prev_wmm[WMM_AC_NUM];
730
731 /* Maximum number of interfaces supported for MBSSID advertisement */
732 unsigned int mbssid_max_interfaces;
733 /* Maximum profile periodicity for enhanced MBSSID advertisement */
734 unsigned int ema_max_periodicity;
735
736 int (*enable_iface_cb)(struct hostapd_iface *iface);
737 int (*disable_iface_cb)(struct hostapd_iface *iface);
738
739 /* Configured freq of interface is NO_IR */
740 bool is_no_ir;
741
742 bool is_ch_switch_dfs; /* Channel switch from ACS to DFS */
743
744 struct hostapd_multi_hw_info *multi_hw_info;
745 unsigned int num_multi_hws;
746 struct hostapd_multi_hw_info *current_hw_info;
747 };
748
749 /* hostapd.c */
750 int hostapd_for_each_interface(struct hapd_interfaces *interfaces,
751 int (*cb)(struct hostapd_iface *iface,
752 void *ctx), void *ctx);
753 int hostapd_reload_config(struct hostapd_iface *iface);
754 void hostapd_reconfig_encryption(struct hostapd_data *hapd);
755 struct hostapd_data *
756 hostapd_alloc_bss_data(struct hostapd_iface *hapd_iface,
757 struct hostapd_config *conf,
758 struct hostapd_bss_config *bss);
759 int hostapd_setup_interface(struct hostapd_iface *iface);
760 int hostapd_setup_interface_complete(struct hostapd_iface *iface, int err);
761 void hostapd_interface_deinit(struct hostapd_iface *iface);
762 void hostapd_interface_free(struct hostapd_iface *iface);
763 struct hostapd_iface * hostapd_alloc_iface(void);
764 struct hostapd_iface * hostapd_init(struct hapd_interfaces *interfaces,
765 const char *config_file);
766 struct hostapd_iface *
767 hostapd_interface_init_bss(struct hapd_interfaces *interfaces, const char *phy,
768 const char *config_fname, int debug);
769 void hostapd_bss_setup_multi_link(struct hostapd_data *hapd,
770 struct hapd_interfaces *interfaces);
771 void hostapd_new_assoc_sta(struct hostapd_data *hapd, struct sta_info *sta,
772 int reassoc);
773 void hostapd_interface_deinit_free(struct hostapd_iface *iface);
774 int hostapd_enable_iface(struct hostapd_iface *hapd_iface);
775 int hostapd_reload_iface(struct hostapd_iface *hapd_iface);
776 int hostapd_reload_bss_only(struct hostapd_data *bss);
777 int hostapd_disable_iface(struct hostapd_iface *hapd_iface);
778 void hostapd_bss_deinit_no_free(struct hostapd_data *hapd);
779 void hostapd_free_hapd_data(struct hostapd_data *hapd);
780 void hostapd_cleanup_iface_partial(struct hostapd_iface *iface);
781 int hostapd_add_iface(struct hapd_interfaces *ifaces, char *buf);
782 int hostapd_remove_iface(struct hapd_interfaces *ifaces, char *buf);
783 void hostapd_channel_list_updated(struct hostapd_iface *iface, int initiator);
784 void hostapd_set_state(struct hostapd_iface *iface, enum hostapd_iface_state s);
785 const char * hostapd_state_text(enum hostapd_iface_state s);
786 int hostapd_csa_in_progress(struct hostapd_iface *iface);
787 void hostapd_chan_switch_config(struct hostapd_data *hapd,
788 struct hostapd_freq_params *freq_params);
789 int hostapd_switch_channel(struct hostapd_data *hapd,
790 struct csa_settings *settings);
791 int hostapd_force_channel_switch(struct hostapd_iface *iface,
792 struct csa_settings *settings);
793 void
794 hostapd_switch_channel_fallback(struct hostapd_iface *iface,
795 const struct hostapd_freq_params *freq_params);
796 void hostapd_cleanup_cs_params(struct hostapd_data *hapd);
797 void hostapd_periodic_iface(struct hostapd_iface *iface);
798 int hostapd_owe_trans_get_info(struct hostapd_data *hapd);
799 void hostapd_ocv_check_csa_sa_query(void *eloop_ctx, void *timeout_ctx);
800
801 void hostapd_switch_color(struct hostapd_data *hapd, u64 bitmap);
802 void hostapd_cleanup_cca_params(struct hostapd_data *hapd);
803
804 /* utils.c */
805 int hostapd_register_probereq_cb(struct hostapd_data *hapd,
806 int (*cb)(void *ctx, const u8 *sa,
807 const u8 *da, const u8 *bssid,
808 const u8 *ie, size_t ie_len,
809 int ssi_signal),
810 void *ctx);
811 void hostapd_prune_associations(struct hostapd_data *hapd, const u8 *addr,
812 int mld_assoc_link_id);
813
814 /* drv_callbacks.c (TODO: move to somewhere else?) */
815 void hostapd_notify_assoc_fils_finish(struct hostapd_data *hapd,
816 struct sta_info *sta);
817 int hostapd_notif_assoc(struct hostapd_data *hapd, const u8 *addr,
818 const u8 *req_ie, size_t req_ielen, const u8 *resp_ie,
819 size_t resp_ielen, const u8 *link_addr, int reassoc);
820 void hostapd_notif_disassoc(struct hostapd_data *hapd, const u8 *addr);
821 void hostapd_event_sta_low_ack(struct hostapd_data *hapd, const u8 *addr);
822 void hostapd_event_connect_failed_reason(struct hostapd_data *hapd,
823 const u8 *addr, int reason_code);
824 int hostapd_probe_req_rx(struct hostapd_data *hapd, const u8 *sa, const u8 *da,
825 const u8 *bssid, const u8 *ie, size_t ie_len,
826 int ssi_signal);
827 void hostapd_event_ch_switch(struct hostapd_data *hapd, int freq, int ht,
828 int offset, int width, int cf1, int cf2,
829 u16 punct_bitmap, int finished);
830 struct survey_results;
831 void hostapd_event_get_survey(struct hostapd_iface *iface,
832 struct survey_results *survey_results);
833 void hostapd_acs_channel_selected(struct hostapd_data *hapd,
834 struct acs_selected_channels *acs_res);
835
836 const struct hostapd_eap_user *
837 hostapd_get_eap_user(struct hostapd_data *hapd, const u8 *identity,
838 size_t identity_len, int phase2);
839
840 struct hostapd_data * hostapd_get_iface(struct hapd_interfaces *interfaces,
841 const char *ifname);
842 void hostapd_event_sta_opmode_changed(struct hostapd_data *hapd, const u8 *addr,
843 enum smps_mode smps_mode,
844 enum chan_width chan_width, u8 rx_nss);
845
846 #ifdef CONFIG_FST
847 void fst_hostapd_fill_iface_obj(struct hostapd_data *hapd,
848 struct fst_wpa_obj *iface_obj);
849 #endif /* CONFIG_FST */
850
851 int hostapd_set_acl(struct hostapd_data *hapd);
852 struct hostapd_data * hostapd_mbssid_get_tx_bss(struct hostapd_data *hapd);
853 int hostapd_mbssid_get_bss_index(struct hostapd_data *hapd);
854 struct hostapd_data * hostapd_mld_get_link_bss(struct hostapd_data *hapd,
855 u8 link_id);
856 int hostapd_link_remove(struct hostapd_data *hapd, u32 count);
857 bool hostapd_is_ml_partner(struct hostapd_data *hapd1,
858 struct hostapd_data *hapd2);
859 u8 hostapd_get_mld_id(struct hostapd_data *hapd);
860 int hostapd_mld_add_link(struct hostapd_data *hapd);
861 int hostapd_mld_remove_link(struct hostapd_data *hapd);
862 u8 hostapd_get_active_links(struct hostapd_data *hapd);
863 struct hostapd_data * hostapd_mld_get_first_bss(struct hostapd_data *hapd);
864
865 int hostapd_build_beacon_data(struct hostapd_data *hapd,
866 struct beacon_data *beacon);
867 void free_beacon_data(struct beacon_data *beacon);
868 int hostapd_fill_cca_settings(struct hostapd_data *hapd,
869 struct cca_settings *settings);
870
871 #ifdef CONFIG_IEEE80211BE
872
873 bool hostapd_mld_is_first_bss(struct hostapd_data *hapd);
874 void hostapd_mld_interface_freed(struct hostapd_data *hapd);
875
876 #define for_each_mld_link(partner, self) \
877 dl_list_for_each(partner, &self->mld->links, struct hostapd_data, link)
878
879 #else /* CONFIG_IEEE80211BE */
880
hostapd_mld_is_first_bss(struct hostapd_data * hapd)881 static inline bool hostapd_mld_is_first_bss(struct hostapd_data *hapd)
882 {
883 return true;
884 }
885
886 #define for_each_mld_link(partner, self) \
887 if (false)
888
889 #endif /* CONFIG_IEEE80211BE */
890
891 u16 hostapd_get_punct_bitmap(struct hostapd_data *hapd);
892
ap_pmf_enabled(struct hostapd_bss_config * conf)893 static inline bool ap_pmf_enabled(struct hostapd_bss_config *conf)
894 {
895 return conf->ieee80211w != NO_MGMT_FRAME_PROTECTION ||
896 conf->rsn_override_mfp != NO_MGMT_FRAME_PROTECTION ||
897 conf->rsn_override_mfp_2 != NO_MGMT_FRAME_PROTECTION;
898 }
899
900 #endif /* HOSTAPD_H */
901