1214501Srpaulo/*
2214501Srpaulo * hostapd / Configuration definitions and helpers functions
3289549Srpaulo * Copyright (c) 2003-2015, Jouni Malinen <j@w1.fi>
4214501Srpaulo *
5252726Srpaulo * This software may be distributed under the terms of the BSD license.
6252726Srpaulo * See README for more details.
7214501Srpaulo */
8214501Srpaulo
9214501Srpaulo#ifndef HOSTAPD_CONFIG_H
10214501Srpaulo#define HOSTAPD_CONFIG_H
11214501Srpaulo
12214501Srpaulo#include "common/defs.h"
13337817Scy#include "utils/list.h"
14214501Srpaulo#include "ip_addr.h"
15214501Srpaulo#include "common/wpa_common.h"
16289549Srpaulo#include "common/ieee802_11_defs.h"
17252726Srpaulo#include "common/ieee802_11_common.h"
18351611Scy#include "crypto/sha256.h"
19252726Srpaulo#include "wps/wps.h"
20289549Srpaulo#include "fst/fst.h"
21337817Scy#include "vlan.h"
22214501Srpaulo
23281806Srpaulo/**
24281806Srpaulo * mesh_conf - local MBSS state and settings
25281806Srpaulo */
26281806Srpaulostruct mesh_conf {
27281806Srpaulo	u8 meshid[32];
28281806Srpaulo	u8 meshid_len;
29281806Srpaulo	/* Active Path Selection Protocol Identifier */
30281806Srpaulo	u8 mesh_pp_id;
31281806Srpaulo	/* Active Path Selection Metric Identifier */
32281806Srpaulo	u8 mesh_pm_id;
33281806Srpaulo	/* Congestion Control Mode Identifier */
34281806Srpaulo	u8 mesh_cc_id;
35281806Srpaulo	/* Synchronization Protocol Identifier */
36281806Srpaulo	u8 mesh_sp_id;
37281806Srpaulo	/* Authentication Protocol Identifier */
38281806Srpaulo	u8 mesh_auth_id;
39289549Srpaulo	u8 *rsn_ie;
40289549Srpaulo	int rsn_ie_len;
41281806Srpaulo#define MESH_CONF_SEC_NONE BIT(0)
42281806Srpaulo#define MESH_CONF_SEC_AUTH BIT(1)
43281806Srpaulo#define MESH_CONF_SEC_AMPE BIT(2)
44281806Srpaulo	unsigned int security;
45337817Scy	enum mfp_options ieee80211w;
46346981Scy	int ocv;
47337817Scy	unsigned int pairwise_cipher;
48337817Scy	unsigned int group_cipher;
49337817Scy	unsigned int mgmt_group_cipher;
50281806Srpaulo	int dot11MeshMaxRetries;
51281806Srpaulo	int dot11MeshRetryTimeout; /* msec */
52281806Srpaulo	int dot11MeshConfirmTimeout; /* msec */
53281806Srpaulo	int dot11MeshHoldingTimeout; /* msec */
54281806Srpaulo};
55281806Srpaulo
56214501Srpaulo#define MAX_STA_COUNT 2007
57214501Srpaulo#define MAX_VLAN_ID 4094
58214501Srpaulo
59214501Srpaulotypedef u8 macaddr[ETH_ALEN];
60214501Srpaulo
61214501Srpaulostruct mac_acl_entry {
62214501Srpaulo	macaddr addr;
63337817Scy	struct vlan_description vlan_id;
64214501Srpaulo};
65214501Srpaulo
66214501Srpaulostruct hostapd_radius_servers;
67214501Srpaulostruct ft_remote_r0kh;
68214501Srpaulostruct ft_remote_r1kh;
69214501Srpaulo
70214501Srpaulo#define NUM_WEP_KEYS 4
71214501Srpaulostruct hostapd_wep_keys {
72214501Srpaulo	u8 idx;
73214501Srpaulo	u8 *key[NUM_WEP_KEYS];
74214501Srpaulo	size_t len[NUM_WEP_KEYS];
75214501Srpaulo	int keys_set;
76214501Srpaulo	size_t default_len; /* key length used for dynamic key generation */
77214501Srpaulo};
78214501Srpaulo
79214501Srpaulotypedef enum hostap_security_policy {
80214501Srpaulo	SECURITY_PLAINTEXT = 0,
81214501Srpaulo	SECURITY_STATIC_WEP = 1,
82214501Srpaulo	SECURITY_IEEE_802_1X = 2,
83214501Srpaulo	SECURITY_WPA_PSK = 3,
84281806Srpaulo	SECURITY_WPA = 4,
85281806Srpaulo	SECURITY_OSEN = 5
86214501Srpaulo} secpolicy;
87214501Srpaulo
88214501Srpaulostruct hostapd_ssid {
89289549Srpaulo	u8 ssid[SSID_MAX_LEN];
90214501Srpaulo	size_t ssid_len;
91252726Srpaulo	unsigned int ssid_set:1;
92252726Srpaulo	unsigned int utf8_ssid:1;
93281806Srpaulo	unsigned int wpa_passphrase_set:1;
94281806Srpaulo	unsigned int wpa_psk_set:1;
95214501Srpaulo
96214501Srpaulo	char vlan[IFNAMSIZ + 1];
97214501Srpaulo	secpolicy security_policy;
98214501Srpaulo
99214501Srpaulo	struct hostapd_wpa_psk *wpa_psk;
100214501Srpaulo	char *wpa_passphrase;
101214501Srpaulo	char *wpa_psk_file;
102214501Srpaulo
103214501Srpaulo	struct hostapd_wep_keys wep;
104214501Srpaulo
105214501Srpaulo#define DYNAMIC_VLAN_DISABLED 0
106214501Srpaulo#define DYNAMIC_VLAN_OPTIONAL 1
107214501Srpaulo#define DYNAMIC_VLAN_REQUIRED 2
108214501Srpaulo	int dynamic_vlan;
109252726Srpaulo#define DYNAMIC_VLAN_NAMING_WITHOUT_DEVICE 0
110252726Srpaulo#define DYNAMIC_VLAN_NAMING_WITH_DEVICE 1
111252726Srpaulo#define DYNAMIC_VLAN_NAMING_END 2
112252726Srpaulo	int vlan_naming;
113337817Scy	int per_sta_vif;
114214501Srpaulo#ifdef CONFIG_FULL_DYNAMIC_VLAN
115214501Srpaulo	char *vlan_tagged_interface;
116214501Srpaulo#endif /* CONFIG_FULL_DYNAMIC_VLAN */
117214501Srpaulo};
118214501Srpaulo
119214501Srpaulo
120214501Srpaulo#define VLAN_ID_WILDCARD -1
121214501Srpaulo
122214501Srpaulostruct hostapd_vlan {
123214501Srpaulo	struct hostapd_vlan *next;
124214501Srpaulo	int vlan_id; /* VLAN ID or -1 (VLAN_ID_WILDCARD) for wildcard entry */
125337817Scy	struct vlan_description vlan_desc;
126214501Srpaulo	char ifname[IFNAMSIZ + 1];
127346981Scy	char bridge[IFNAMSIZ + 1];
128289549Srpaulo	int configured;
129214501Srpaulo	int dynamic_vlan;
130214501Srpaulo#ifdef CONFIG_FULL_DYNAMIC_VLAN
131214501Srpaulo
132214501Srpaulo#define DVLAN_CLEAN_WLAN_PORT	0x8
133214501Srpaulo	int clean;
134214501Srpaulo#endif /* CONFIG_FULL_DYNAMIC_VLAN */
135214501Srpaulo};
136214501Srpaulo
137214501Srpaulo#define PMK_LEN 32
138346981Scy#define KEYID_LEN 32
139337817Scy#define MIN_PASSPHRASE_LEN 8
140337817Scy#define MAX_PASSPHRASE_LEN 63
141252726Srpaulostruct hostapd_sta_wpa_psk_short {
142252726Srpaulo	struct hostapd_sta_wpa_psk_short *next;
143337817Scy	unsigned int is_passphrase:1;
144252726Srpaulo	u8 psk[PMK_LEN];
145337817Scy	char passphrase[MAX_PASSPHRASE_LEN + 1];
146337817Scy	int ref; /* (number of references held) - 1 */
147252726Srpaulo};
148252726Srpaulo
149214501Srpaulostruct hostapd_wpa_psk {
150214501Srpaulo	struct hostapd_wpa_psk *next;
151214501Srpaulo	int group;
152346981Scy	char keyid[KEYID_LEN];
153214501Srpaulo	u8 psk[PMK_LEN];
154214501Srpaulo	u8 addr[ETH_ALEN];
155281806Srpaulo	u8 p2p_dev_addr[ETH_ALEN];
156346981Scy	int vlan_id;
157214501Srpaulo};
158214501Srpaulo
159214501Srpaulostruct hostapd_eap_user {
160214501Srpaulo	struct hostapd_eap_user *next;
161214501Srpaulo	u8 *identity;
162214501Srpaulo	size_t identity_len;
163214501Srpaulo	struct {
164214501Srpaulo		int vendor;
165214501Srpaulo		u32 method;
166252726Srpaulo	} methods[EAP_MAX_METHODS];
167214501Srpaulo	u8 *password;
168214501Srpaulo	size_t password_len;
169346981Scy	u8 *salt;
170346981Scy	size_t salt_len; /* non-zero when password is salted */
171214501Srpaulo	int phase2;
172214501Srpaulo	int force_version;
173214501Srpaulo	unsigned int wildcard_prefix:1;
174214501Srpaulo	unsigned int password_hash:1; /* whether password is hashed with
175214501Srpaulo				       * nt_password_hash() */
176281806Srpaulo	unsigned int remediation:1;
177281806Srpaulo	unsigned int macacl:1;
178214501Srpaulo	int ttls_auth; /* EAP_TTLS_AUTH_* bitfield */
179281806Srpaulo	struct hostapd_radius_attr *accept_attr;
180346981Scy	u32 t_c_timestamp;
181214501Srpaulo};
182214501Srpaulo
183252726Srpaulostruct hostapd_radius_attr {
184252726Srpaulo	u8 type;
185252726Srpaulo	struct wpabuf *val;
186252726Srpaulo	struct hostapd_radius_attr *next;
187252726Srpaulo};
188214501Srpaulo
189214501Srpaulo
190252726Srpaulo#define NUM_TX_QUEUES 4
191252726Srpaulo
192214501Srpaulostruct hostapd_tx_queue_params {
193214501Srpaulo	int aifs;
194214501Srpaulo	int cwmin;
195214501Srpaulo	int cwmax;
196214501Srpaulo	int burst; /* maximum burst time in 0.1 ms, i.e., 10 = 1 ms */
197214501Srpaulo};
198214501Srpaulo
199252726Srpaulo
200252726Srpaulo#define MAX_ROAMING_CONSORTIUM_LEN 15
201252726Srpaulo
202252726Srpaulostruct hostapd_roaming_consortium {
203252726Srpaulo	u8 len;
204252726Srpaulo	u8 oi[MAX_ROAMING_CONSORTIUM_LEN];
205214501Srpaulo};
206214501Srpaulo
207252726Srpaulostruct hostapd_lang_string {
208252726Srpaulo	u8 lang[3];
209252726Srpaulo	u8 name_len;
210252726Srpaulo	u8 name[252];
211252726Srpaulo};
212214501Srpaulo
213346981Scystruct hostapd_venue_url {
214346981Scy	u8 venue_number;
215346981Scy	u8 url_len;
216346981Scy	u8 url[254];
217346981Scy};
218346981Scy
219252726Srpaulo#define MAX_NAI_REALMS 10
220252726Srpaulo#define MAX_NAI_REALMLEN 255
221252726Srpaulo#define MAX_NAI_EAP_METHODS 5
222252726Srpaulo#define MAX_NAI_AUTH_TYPES 4
223252726Srpaulostruct hostapd_nai_realm_data {
224252726Srpaulo	u8 encoding;
225252726Srpaulo	char realm_buf[MAX_NAI_REALMLEN + 1];
226252726Srpaulo	char *realm[MAX_NAI_REALMS];
227252726Srpaulo	u8 eap_method_count;
228252726Srpaulo	struct hostapd_nai_realm_eap {
229252726Srpaulo		u8 eap_method;
230252726Srpaulo		u8 num_auths;
231252726Srpaulo		u8 auth_id[MAX_NAI_AUTH_TYPES];
232252726Srpaulo		u8 auth_val[MAX_NAI_AUTH_TYPES];
233252726Srpaulo	} eap_method[MAX_NAI_EAP_METHODS];
234252726Srpaulo};
235252726Srpaulo
236337817Scystruct anqp_element {
237337817Scy	struct dl_list list;
238337817Scy	u16 infoid;
239337817Scy	struct wpabuf *payload;
240337817Scy};
241337817Scy
242346981Scystruct fils_realm {
243346981Scy	struct dl_list list;
244346981Scy	u8 hash[2];
245346981Scy	char realm[];
246346981Scy};
247337817Scy
248346981Scystruct sae_password_entry {
249346981Scy	struct sae_password_entry *next;
250346981Scy	char *password;
251346981Scy	char *identifier;
252346981Scy	u8 peer_addr[ETH_ALEN];
253346981Scy	int vlan_id;
254346981Scy};
255346981Scy
256351611Scystruct dpp_controller_conf {
257351611Scy	struct dpp_controller_conf *next;
258351611Scy	u8 pkhash[SHA256_MAC_LEN];
259351611Scy	struct hostapd_ip_addr ipaddr;
260351611Scy};
261351611Scy
262351611Scystruct airtime_sta_weight {
263351611Scy	struct airtime_sta_weight *next;
264351611Scy	unsigned int weight;
265351611Scy	u8 addr[ETH_ALEN];
266351611Scy};
267351611Scy
268214501Srpaulo/**
269214501Srpaulo * struct hostapd_bss_config - Per-BSS configuration
270214501Srpaulo */
271214501Srpaulostruct hostapd_bss_config {
272214501Srpaulo	char iface[IFNAMSIZ + 1];
273214501Srpaulo	char bridge[IFNAMSIZ + 1];
274281806Srpaulo	char vlan_bridge[IFNAMSIZ + 1];
275252726Srpaulo	char wds_bridge[IFNAMSIZ + 1];
276214501Srpaulo
277214501Srpaulo	enum hostapd_logger_level logger_syslog_level, logger_stdout_level;
278214501Srpaulo
279214501Srpaulo	unsigned int logger_syslog; /* module bitfield */
280214501Srpaulo	unsigned int logger_stdout; /* module bitfield */
281214501Srpaulo
282214501Srpaulo	int max_num_sta; /* maximum number of STAs in station table */
283214501Srpaulo
284214501Srpaulo	int dtim_period;
285346981Scy	unsigned int bss_load_update_period;
286346981Scy	unsigned int chan_util_avg_period;
287214501Srpaulo
288214501Srpaulo	int ieee802_1x; /* use IEEE 802.1X */
289214501Srpaulo	int eapol_version;
290214501Srpaulo	int eap_server; /* Use internal EAP server instead of external
291214501Srpaulo			 * RADIUS server */
292214501Srpaulo	struct hostapd_eap_user *eap_user;
293252726Srpaulo	char *eap_user_sqlite;
294214501Srpaulo	char *eap_sim_db;
295337817Scy	unsigned int eap_sim_db_timeout;
296281806Srpaulo	int eap_server_erp; /* Whether ERP is enabled on internal EAP server */
297214501Srpaulo	struct hostapd_ip_addr own_ip_addr;
298214501Srpaulo	char *nas_identifier;
299214501Srpaulo	struct hostapd_radius_servers *radius;
300214501Srpaulo	int acct_interim_interval;
301252726Srpaulo	int radius_request_cui;
302252726Srpaulo	struct hostapd_radius_attr *radius_auth_req_attr;
303252726Srpaulo	struct hostapd_radius_attr *radius_acct_req_attr;
304351611Scy	char *radius_req_attr_sqlite;
305252726Srpaulo	int radius_das_port;
306252726Srpaulo	unsigned int radius_das_time_window;
307252726Srpaulo	int radius_das_require_event_timestamp;
308337817Scy	int radius_das_require_message_authenticator;
309252726Srpaulo	struct hostapd_ip_addr radius_das_client_addr;
310252726Srpaulo	u8 *radius_das_shared_secret;
311252726Srpaulo	size_t radius_das_shared_secret_len;
312214501Srpaulo
313214501Srpaulo	struct hostapd_ssid ssid;
314214501Srpaulo
315214501Srpaulo	char *eap_req_id_text; /* optional displayable message sent with
316214501Srpaulo				* EAP Request-Identity */
317214501Srpaulo	size_t eap_req_id_text_len;
318214501Srpaulo	int eapol_key_index_workaround;
319214501Srpaulo
320214501Srpaulo	size_t default_wep_key_len;
321214501Srpaulo	int individual_wep_key_len;
322214501Srpaulo	int wep_rekeying_period;
323214501Srpaulo	int broadcast_key_idx_min, broadcast_key_idx_max;
324214501Srpaulo	int eap_reauth_period;
325281806Srpaulo	int erp_send_reauth_start;
326281806Srpaulo	char *erp_domain;
327214501Srpaulo
328214501Srpaulo	int ieee802_11f; /* use IEEE 802.11f (IAPP) */
329214501Srpaulo	char iapp_iface[IFNAMSIZ + 1]; /* interface used with IAPP broadcast
330214501Srpaulo					* frames */
331214501Srpaulo
332346981Scy	enum macaddr_acl {
333214501Srpaulo		ACCEPT_UNLESS_DENIED = 0,
334214501Srpaulo		DENY_UNLESS_ACCEPTED = 1,
335214501Srpaulo		USE_EXTERNAL_RADIUS_AUTH = 2
336214501Srpaulo	} macaddr_acl;
337214501Srpaulo	struct mac_acl_entry *accept_mac;
338214501Srpaulo	int num_accept_mac;
339214501Srpaulo	struct mac_acl_entry *deny_mac;
340214501Srpaulo	int num_deny_mac;
341214501Srpaulo	int wds_sta;
342252726Srpaulo	int isolate;
343281806Srpaulo	int start_disabled;
344214501Srpaulo
345214501Srpaulo	int auth_algs; /* bitfield of allowed IEEE 802.11 authentication
346214501Srpaulo			* algorithms, WPA_AUTH_ALG_{OPEN,SHARED,LEAP} */
347214501Srpaulo
348214501Srpaulo	int wpa; /* bitfield of WPA_PROTO_WPA, WPA_PROTO_RSN */
349214501Srpaulo	int wpa_key_mgmt;
350214501Srpaulo#ifdef CONFIG_IEEE80211W
351214501Srpaulo	enum mfp_options ieee80211w;
352281806Srpaulo	int group_mgmt_cipher;
353214501Srpaulo	/* dot11AssociationSAQueryMaximumTimeout (in TUs) */
354214501Srpaulo	unsigned int assoc_sa_query_max_timeout;
355214501Srpaulo	/* dot11AssociationSAQueryRetryTimeout (in TUs) */
356214501Srpaulo	int assoc_sa_query_retry_timeout;
357214501Srpaulo#endif /* CONFIG_IEEE80211W */
358346981Scy#ifdef CONFIG_OCV
359346981Scy	int ocv; /* Operating Channel Validation */
360346981Scy#endif /* CONFIG_OCV */
361252726Srpaulo	enum {
362252726Srpaulo		PSK_RADIUS_IGNORED = 0,
363252726Srpaulo		PSK_RADIUS_ACCEPTED = 1,
364252726Srpaulo		PSK_RADIUS_REQUIRED = 2
365252726Srpaulo	} wpa_psk_radius;
366214501Srpaulo	int wpa_pairwise;
367346981Scy	int group_cipher; /* wpa_group value override from configuation */
368214501Srpaulo	int wpa_group;
369214501Srpaulo	int wpa_group_rekey;
370346981Scy	int wpa_group_rekey_set;
371214501Srpaulo	int wpa_strict_rekey;
372214501Srpaulo	int wpa_gmk_rekey;
373214501Srpaulo	int wpa_ptk_rekey;
374346981Scy	u32 wpa_group_update_count;
375346981Scy	u32 wpa_pairwise_update_count;
376346981Scy	int wpa_disable_eapol_key_retries;
377214501Srpaulo	int rsn_pairwise;
378214501Srpaulo	int rsn_preauth;
379214501Srpaulo	char *rsn_preauth_interfaces;
380214501Srpaulo
381346981Scy#ifdef CONFIG_IEEE80211R_AP
382214501Srpaulo	/* IEEE 802.11r - Fast BSS Transition */
383214501Srpaulo	u8 mobility_domain[MOBILITY_DOMAIN_ID_LEN];
384214501Srpaulo	u8 r1_key_holder[FT_R1KH_ID_LEN];
385346981Scy	u32 r0_key_lifetime; /* PMK-R0 lifetime seconds */
386346981Scy	int rkh_pos_timeout;
387346981Scy	int rkh_neg_timeout;
388346981Scy	int rkh_pull_timeout; /* ms */
389346981Scy	int rkh_pull_retries;
390214501Srpaulo	u32 reassociation_deadline;
391214501Srpaulo	struct ft_remote_r0kh *r0kh_list;
392214501Srpaulo	struct ft_remote_r1kh *r1kh_list;
393214501Srpaulo	int pmk_r1_push;
394252726Srpaulo	int ft_over_ds;
395346981Scy	int ft_psk_generate_local;
396346981Scy	int r1_max_key_lifetime;
397346981Scy#endif /* CONFIG_IEEE80211R_AP */
398214501Srpaulo
399214501Srpaulo	char *ctrl_interface; /* directory for UNIX domain sockets */
400214501Srpaulo#ifndef CONFIG_NATIVE_WINDOWS
401214501Srpaulo	gid_t ctrl_interface_gid;
402214501Srpaulo#endif /* CONFIG_NATIVE_WINDOWS */
403214501Srpaulo	int ctrl_interface_gid_set;
404214501Srpaulo
405214501Srpaulo	char *ca_cert;
406214501Srpaulo	char *server_cert;
407351611Scy	char *server_cert2;
408214501Srpaulo	char *private_key;
409351611Scy	char *private_key2;
410214501Srpaulo	char *private_key_passwd;
411351611Scy	char *private_key_passwd2;
412346981Scy	char *check_cert_subject;
413214501Srpaulo	int check_crl;
414346981Scy	int check_crl_strict;
415346981Scy	unsigned int crl_reload_interval;
416289549Srpaulo	unsigned int tls_session_lifetime;
417346981Scy	unsigned int tls_flags;
418281806Srpaulo	char *ocsp_stapling_response;
419337817Scy	char *ocsp_stapling_response_multi;
420214501Srpaulo	char *dh_file;
421281806Srpaulo	char *openssl_ciphers;
422346981Scy	char *openssl_ecdh_curves;
423214501Srpaulo	u8 *pac_opaque_encr_key;
424214501Srpaulo	u8 *eap_fast_a_id;
425214501Srpaulo	size_t eap_fast_a_id_len;
426214501Srpaulo	char *eap_fast_a_id_info;
427214501Srpaulo	int eap_fast_prov;
428214501Srpaulo	int pac_key_lifetime;
429214501Srpaulo	int pac_key_refresh_time;
430351611Scy	int eap_teap_auth;
431351611Scy	int eap_teap_pac_no_inner;
432214501Srpaulo	int eap_sim_aka_result_ind;
433351611Scy	int eap_sim_id;
434214501Srpaulo	int tnc;
435252726Srpaulo	int fragment_size;
436252726Srpaulo	u16 pwd_group;
437214501Srpaulo
438214501Srpaulo	char *radius_server_clients;
439214501Srpaulo	int radius_server_auth_port;
440281806Srpaulo	int radius_server_acct_port;
441214501Srpaulo	int radius_server_ipv6;
442214501Srpaulo
443214501Srpaulo	int use_pae_group_addr; /* Whether to send EAPOL frames to PAE group
444214501Srpaulo				 * address instead of individual address
445214501Srpaulo				 * (for driver_wired.c).
446214501Srpaulo				 */
447214501Srpaulo
448214501Srpaulo	int ap_max_inactivity;
449214501Srpaulo	int ignore_broadcast_ssid;
450337817Scy	int no_probe_resp_if_max_sta;
451214501Srpaulo
452214501Srpaulo	int wmm_enabled;
453214501Srpaulo	int wmm_uapsd;
454214501Srpaulo
455281806Srpaulo	struct hostapd_vlan *vlan;
456214501Srpaulo
457214501Srpaulo	macaddr bssid;
458214501Srpaulo
459214501Srpaulo	/*
460214501Srpaulo	 * Maximum listen interval that STAs can use when associating with this
461214501Srpaulo	 * BSS. If a STA tries to use larger value, the association will be
462214501Srpaulo	 * denied with status code 51.
463214501Srpaulo	 */
464214501Srpaulo	u16 max_listen_interval;
465214501Srpaulo
466252726Srpaulo	int disable_pmksa_caching;
467214501Srpaulo	int okc; /* Opportunistic Key Caching */
468214501Srpaulo
469214501Srpaulo	int wps_state;
470214501Srpaulo#ifdef CONFIG_WPS
471281806Srpaulo	int wps_independent;
472214501Srpaulo	int ap_setup_locked;
473214501Srpaulo	u8 uuid[16];
474214501Srpaulo	char *wps_pin_requests;
475214501Srpaulo	char *device_name;
476214501Srpaulo	char *manufacturer;
477214501Srpaulo	char *model_name;
478214501Srpaulo	char *model_number;
479214501Srpaulo	char *serial_number;
480252726Srpaulo	u8 device_type[WPS_DEV_TYPE_LEN];
481214501Srpaulo	char *config_methods;
482214501Srpaulo	u8 os_version[4];
483214501Srpaulo	char *ap_pin;
484214501Srpaulo	int skip_cred_build;
485214501Srpaulo	u8 *extra_cred;
486214501Srpaulo	size_t extra_cred_len;
487214501Srpaulo	int wps_cred_processing;
488346981Scy	int wps_cred_add_sae;
489281806Srpaulo	int force_per_enrollee_psk;
490214501Srpaulo	u8 *ap_settings;
491214501Srpaulo	size_t ap_settings_len;
492346981Scy	struct hostapd_ssid multi_ap_backhaul_ssid;
493214501Srpaulo	char *upnp_iface;
494214501Srpaulo	char *friendly_name;
495214501Srpaulo	char *manufacturer_url;
496214501Srpaulo	char *model_description;
497214501Srpaulo	char *model_url;
498214501Srpaulo	char *upc;
499252726Srpaulo	struct wpabuf *wps_vendor_ext[MAX_WPS_VENDOR_EXTENSIONS];
500281806Srpaulo	int wps_nfc_pw_from_config;
501252726Srpaulo	int wps_nfc_dev_pw_id;
502252726Srpaulo	struct wpabuf *wps_nfc_dh_pubkey;
503252726Srpaulo	struct wpabuf *wps_nfc_dh_privkey;
504252726Srpaulo	struct wpabuf *wps_nfc_dev_pw;
505214501Srpaulo#endif /* CONFIG_WPS */
506252726Srpaulo	int pbc_in_m1;
507281806Srpaulo	char *server_id;
508252726Srpaulo
509252726Srpaulo#define P2P_ENABLED BIT(0)
510252726Srpaulo#define P2P_GROUP_OWNER BIT(1)
511252726Srpaulo#define P2P_GROUP_FORMATION BIT(2)
512252726Srpaulo#define P2P_MANAGE BIT(3)
513252726Srpaulo#define P2P_ALLOW_CROSS_CONNECTION BIT(4)
514252726Srpaulo	int p2p;
515281806Srpaulo#ifdef CONFIG_P2P
516281806Srpaulo	u8 ip_addr_go[4];
517281806Srpaulo	u8 ip_addr_mask[4];
518281806Srpaulo	u8 ip_addr_start[4];
519281806Srpaulo	u8 ip_addr_end[4];
520281806Srpaulo#endif /* CONFIG_P2P */
521252726Srpaulo
522252726Srpaulo	int disassoc_low_ack;
523252726Srpaulo	int skip_inactivity_poll;
524252726Srpaulo
525252726Srpaulo#define TDLS_PROHIBIT BIT(0)
526252726Srpaulo#define TDLS_PROHIBIT_CHAN_SWITCH BIT(1)
527252726Srpaulo	int tdls;
528252726Srpaulo	int disable_11n;
529252726Srpaulo	int disable_11ac;
530252726Srpaulo
531252726Srpaulo	/* IEEE 802.11v */
532252726Srpaulo	int time_advertisement;
533252726Srpaulo	char *time_zone;
534252726Srpaulo	int wnm_sleep_mode;
535346981Scy	int wnm_sleep_mode_no_keys;
536252726Srpaulo	int bss_transition;
537252726Srpaulo
538252726Srpaulo	/* IEEE 802.11u - Interworking */
539252726Srpaulo	int interworking;
540252726Srpaulo	int access_network_type;
541252726Srpaulo	int internet;
542252726Srpaulo	int asra;
543252726Srpaulo	int esr;
544252726Srpaulo	int uesa;
545252726Srpaulo	int venue_info_set;
546252726Srpaulo	u8 venue_group;
547252726Srpaulo	u8 venue_type;
548252726Srpaulo	u8 hessid[ETH_ALEN];
549252726Srpaulo
550252726Srpaulo	/* IEEE 802.11u - Roaming Consortium list */
551252726Srpaulo	unsigned int roaming_consortium_count;
552252726Srpaulo	struct hostapd_roaming_consortium *roaming_consortium;
553252726Srpaulo
554252726Srpaulo	/* IEEE 802.11u - Venue Name duples */
555252726Srpaulo	unsigned int venue_name_count;
556252726Srpaulo	struct hostapd_lang_string *venue_name;
557252726Srpaulo
558346981Scy	/* Venue URL duples */
559346981Scy	unsigned int venue_url_count;
560346981Scy	struct hostapd_venue_url *venue_url;
561346981Scy
562252726Srpaulo	/* IEEE 802.11u - Network Authentication Type */
563252726Srpaulo	u8 *network_auth_type;
564252726Srpaulo	size_t network_auth_type_len;
565252726Srpaulo
566252726Srpaulo	/* IEEE 802.11u - IP Address Type Availability */
567252726Srpaulo	u8 ipaddr_type_availability;
568252726Srpaulo	u8 ipaddr_type_configured;
569252726Srpaulo
570252726Srpaulo	/* IEEE 802.11u - 3GPP Cellular Network */
571252726Srpaulo	u8 *anqp_3gpp_cell_net;
572252726Srpaulo	size_t anqp_3gpp_cell_net_len;
573252726Srpaulo
574252726Srpaulo	/* IEEE 802.11u - Domain Name */
575252726Srpaulo	u8 *domain_name;
576252726Srpaulo	size_t domain_name_len;
577252726Srpaulo
578252726Srpaulo	unsigned int nai_realm_count;
579252726Srpaulo	struct hostapd_nai_realm_data *nai_realm_data;
580252726Srpaulo
581337817Scy	struct dl_list anqp_elem; /* list of struct anqp_element */
582337817Scy
583252726Srpaulo	u16 gas_comeback_delay;
584346981Scy	size_t gas_frag_limit;
585337817Scy	int gas_address3;
586252726Srpaulo
587281806Srpaulo	u8 qos_map_set[16 + 2 * 21];
588281806Srpaulo	unsigned int qos_map_set_len;
589281806Srpaulo
590281806Srpaulo	int osen;
591281806Srpaulo	int proxy_arp;
592289549Srpaulo	int na_mcast_to_ucast;
593351611Scy
594252726Srpaulo#ifdef CONFIG_HS20
595252726Srpaulo	int hs20;
596346981Scy	int hs20_release;
597252726Srpaulo	int disable_dgaf;
598281806Srpaulo	u16 anqp_domain_id;
599252726Srpaulo	unsigned int hs20_oper_friendly_name_count;
600252726Srpaulo	struct hostapd_lang_string *hs20_oper_friendly_name;
601252726Srpaulo	u8 *hs20_wan_metrics;
602252726Srpaulo	u8 *hs20_connection_capability;
603252726Srpaulo	size_t hs20_connection_capability_len;
604252726Srpaulo	u8 *hs20_operating_class;
605252726Srpaulo	u8 hs20_operating_class_len;
606281806Srpaulo	struct hs20_icon {
607281806Srpaulo		u16 width;
608281806Srpaulo		u16 height;
609281806Srpaulo		char language[3];
610281806Srpaulo		char type[256];
611281806Srpaulo		char name[256];
612281806Srpaulo		char file[256];
613281806Srpaulo	} *hs20_icons;
614281806Srpaulo	size_t hs20_icons_count;
615289549Srpaulo	u8 osu_ssid[SSID_MAX_LEN];
616281806Srpaulo	size_t osu_ssid_len;
617281806Srpaulo	struct hs20_osu_provider {
618281806Srpaulo		unsigned int friendly_name_count;
619281806Srpaulo		struct hostapd_lang_string *friendly_name;
620281806Srpaulo		char *server_uri;
621281806Srpaulo		int *method_list;
622281806Srpaulo		char **icons;
623281806Srpaulo		size_t icons_count;
624281806Srpaulo		char *osu_nai;
625346981Scy		char *osu_nai2;
626281806Srpaulo		unsigned int service_desc_count;
627281806Srpaulo		struct hostapd_lang_string *service_desc;
628281806Srpaulo	} *hs20_osu_providers, *last_osu;
629281806Srpaulo	size_t hs20_osu_providers_count;
630346981Scy	size_t hs20_osu_providers_nai_count;
631346981Scy	char **hs20_operator_icon;
632346981Scy	size_t hs20_operator_icon_count;
633281806Srpaulo	unsigned int hs20_deauth_req_timeout;
634281806Srpaulo	char *subscr_remediation_url;
635281806Srpaulo	u8 subscr_remediation_method;
636346981Scy	char *hs20_sim_provisioning_url;
637346981Scy	char *t_c_filename;
638346981Scy	u32 t_c_timestamp;
639346981Scy	char *t_c_server_url;
640252726Srpaulo#endif /* CONFIG_HS20 */
641252726Srpaulo
642252726Srpaulo	u8 wps_rf_bands; /* RF bands for WPS (WPS_RF_*) */
643252726Srpaulo
644252726Srpaulo#ifdef CONFIG_RADIUS_TEST
645252726Srpaulo	char *dump_msk_file;
646252726Srpaulo#endif /* CONFIG_RADIUS_TEST */
647252726Srpaulo
648252726Srpaulo	struct wpabuf *vendor_elements;
649337817Scy	struct wpabuf *assocresp_elements;
650281806Srpaulo
651281806Srpaulo	unsigned int sae_anti_clogging_threshold;
652346981Scy	unsigned int sae_sync;
653346981Scy	int sae_require_mfp;
654281806Srpaulo	int *sae_groups;
655346981Scy	struct sae_password_entry *sae_passwords;
656281806Srpaulo
657281806Srpaulo	char *wowlan_triggers; /* Wake-on-WLAN triggers */
658281806Srpaulo
659281806Srpaulo#ifdef CONFIG_TESTING_OPTIONS
660281806Srpaulo	u8 bss_load_test[5];
661281806Srpaulo	u8 bss_load_test_set;
662289549Srpaulo	struct wpabuf *own_ie_override;
663346981Scy	int sae_reflection_attack;
664346981Scy	struct wpabuf *sae_commit_override;
665281806Srpaulo#endif /* CONFIG_TESTING_OPTIONS */
666281806Srpaulo
667281806Srpaulo#define MESH_ENABLED BIT(0)
668281806Srpaulo	int mesh;
669281806Srpaulo
670337817Scy	u8 radio_measurements[RRM_CAPABILITIES_IE_LEN];
671281806Srpaulo
672281806Srpaulo	int vendor_vht;
673337817Scy	int use_sta_nsts;
674289549Srpaulo
675289549Srpaulo	char *no_probe_resp_if_seen_on;
676289549Srpaulo	char *no_auth_if_seen_on;
677337817Scy
678337817Scy	int pbss;
679337817Scy
680337817Scy#ifdef CONFIG_MBO
681337817Scy	int mbo_enabled;
682346981Scy	/**
683346981Scy	 * oce - Enable OCE in AP and/or STA-CFON mode
684346981Scy	 *  - BIT(0) is Reserved
685346981Scy	 *  - Set BIT(1) to enable OCE in STA-CFON mode
686346981Scy	 *  - Set BIT(2) to enable OCE in AP mode
687346981Scy	 */
688346981Scy	unsigned int oce;
689346981Scy	int mbo_cell_data_conn_pref;
690337817Scy#endif /* CONFIG_MBO */
691337817Scy
692337817Scy	int ftm_responder;
693337817Scy	int ftm_initiator;
694346981Scy
695346981Scy#ifdef CONFIG_FILS
696346981Scy	u8 fils_cache_id[FILS_CACHE_ID_LEN];
697346981Scy	int fils_cache_id_set;
698346981Scy	struct dl_list fils_realms; /* list of struct fils_realm */
699346981Scy	int fils_dh_group;
700346981Scy	struct hostapd_ip_addr dhcp_server;
701346981Scy	int dhcp_rapid_commit_proxy;
702346981Scy	unsigned int fils_hlp_wait_time;
703346981Scy	u16 dhcp_server_port;
704346981Scy	u16 dhcp_relay_port;
705346981Scy#endif /* CONFIG_FILS */
706346981Scy
707346981Scy	int multicast_to_unicast;
708346981Scy
709346981Scy	int broadcast_deauth;
710346981Scy
711346981Scy#ifdef CONFIG_DPP
712346981Scy	char *dpp_connector;
713346981Scy	struct wpabuf *dpp_netaccesskey;
714346981Scy	unsigned int dpp_netaccesskey_expiry;
715346981Scy	struct wpabuf *dpp_csign;
716351611Scy#ifdef CONFIG_DPP2
717351611Scy	struct dpp_controller_conf *dpp_controller;
718351611Scy#endif /* CONFIG_DPP2 */
719346981Scy#endif /* CONFIG_DPP */
720346981Scy
721346981Scy#ifdef CONFIG_OWE
722346981Scy	macaddr owe_transition_bssid;
723346981Scy	u8 owe_transition_ssid[SSID_MAX_LEN];
724346981Scy	size_t owe_transition_ssid_len;
725346981Scy	char owe_transition_ifname[IFNAMSIZ + 1];
726346981Scy	int *owe_groups;
727346981Scy#endif /* CONFIG_OWE */
728346981Scy
729346981Scy	int coloc_intf_reporting;
730346981Scy
731346981Scy	u8 send_probe_response;
732346981Scy
733346981Scy#define BACKHAUL_BSS 1
734346981Scy#define FRONTHAUL_BSS 2
735346981Scy	int multi_ap; /* bitmap of BACKHAUL_BSS, FRONTHAUL_BSS */
736351611Scy
737351611Scy#ifdef CONFIG_AIRTIME_POLICY
738351611Scy	unsigned int airtime_weight;
739351611Scy	int airtime_limit;
740351611Scy	struct airtime_sta_weight *airtime_weight_list;
741351611Scy#endif /* CONFIG_AIRTIME_POLICY */
742351611Scy
743351611Scy#ifdef CONFIG_MACSEC
744351611Scy	/**
745351611Scy	 * macsec_policy - Determines the policy for MACsec secure session
746351611Scy	 *
747351611Scy	 * 0: MACsec not in use (default)
748351611Scy	 * 1: MACsec enabled - Should secure, accept key server's advice to
749351611Scy	 *    determine whether to use a secure session or not.
750351611Scy	 */
751351611Scy	int macsec_policy;
752351611Scy
753351611Scy	/**
754351611Scy	 * macsec_integ_only - Determines how MACsec are transmitted
755351611Scy	 *
756351611Scy	 * This setting applies only when MACsec is in use, i.e.,
757351611Scy	 *  - macsec_policy is enabled
758351611Scy	 *  - the key server has decided to enable MACsec
759351611Scy	 *
760351611Scy	 * 0: Encrypt traffic (default)
761351611Scy	 * 1: Integrity only
762351611Scy	 */
763351611Scy	int macsec_integ_only;
764351611Scy
765351611Scy	/**
766351611Scy	 * macsec_replay_protect - Enable MACsec replay protection
767351611Scy	 *
768351611Scy	 * This setting applies only when MACsec is in use, i.e.,
769351611Scy	 *  - macsec_policy is enabled
770351611Scy	 *  - the key server has decided to enable MACsec
771351611Scy	 *
772351611Scy	 * 0: Replay protection disabled (default)
773351611Scy	 * 1: Replay protection enabled
774351611Scy	 */
775351611Scy	int macsec_replay_protect;
776351611Scy
777351611Scy	/**
778351611Scy	 * macsec_replay_window - MACsec replay protection window
779351611Scy	 *
780351611Scy	 * A window in which replay is tolerated, to allow receipt of frames
781351611Scy	 * that have been misordered by the network.
782351611Scy	 *
783351611Scy	 * This setting applies only when MACsec replay protection active, i.e.,
784351611Scy	 *  - macsec_replay_protect is enabled
785351611Scy	 *  - the key server has decided to enable MACsec
786351611Scy	 *
787351611Scy	 * 0: No replay window, strict check (default)
788351611Scy	 * 1..2^32-1: number of packets that could be misordered
789351611Scy	 */
790351611Scy	u32 macsec_replay_window;
791351611Scy
792351611Scy	/**
793351611Scy	 * macsec_port - MACsec port (in SCI)
794351611Scy	 *
795351611Scy	 * Port component of the SCI.
796351611Scy	 *
797351611Scy	 * Range: 1-65534 (default: 1)
798351611Scy	 */
799351611Scy	int macsec_port;
800351611Scy
801351611Scy	/**
802351611Scy	 * mka_priority - Priority of MKA Actor
803351611Scy	 *
804351611Scy	 * Range: 0-255 (default: 255)
805351611Scy	 */
806351611Scy	int mka_priority;
807351611Scy
808351611Scy	/**
809351611Scy	 * mka_ckn - MKA pre-shared CKN
810351611Scy	 */
811351611Scy#define MACSEC_CKN_MAX_LEN 32
812351611Scy	size_t mka_ckn_len;
813351611Scy	u8 mka_ckn[MACSEC_CKN_MAX_LEN];
814351611Scy
815351611Scy	/**
816351611Scy	 * mka_cak - MKA pre-shared CAK
817351611Scy	 */
818351611Scy#define MACSEC_CAK_MAX_LEN 32
819351611Scy	size_t mka_cak_len;
820351611Scy	u8 mka_cak[MACSEC_CAK_MAX_LEN];
821351611Scy
822351611Scy#define MKA_PSK_SET_CKN BIT(0)
823351611Scy#define MKA_PSK_SET_CAK BIT(1)
824351611Scy#define MKA_PSK_SET (MKA_PSK_SET_CKN | MKA_PSK_SET_CAK)
825351611Scy	/**
826351611Scy	 * mka_psk_set - Whether mka_ckn and mka_cak are set
827351611Scy	 */
828351611Scy	u8 mka_psk_set;
829351611Scy#endif /* CONFIG_MACSEC */
830214501Srpaulo};
831214501Srpaulo
832346981Scy/**
833346981Scy * struct he_phy_capabilities_info - HE PHY capabilities
834346981Scy */
835346981Scystruct he_phy_capabilities_info {
836346981Scy	Boolean he_su_beamformer;
837346981Scy	Boolean he_su_beamformee;
838346981Scy	Boolean he_mu_beamformer;
839346981Scy};
840214501Srpaulo
841214501Srpaulo/**
842346981Scy * struct he_operation - HE operation
843346981Scy */
844346981Scystruct he_operation {
845346981Scy	u8 he_bss_color;
846346981Scy	u8 he_default_pe_duration;
847346981Scy	u8 he_twt_required;
848351611Scy	u16 he_rts_threshold;
849351611Scy	u16 he_basic_mcs_nss_set;
850346981Scy};
851346981Scy
852346981Scy/**
853351611Scy * struct spatial_reuse - Spatial reuse
854351611Scy */
855351611Scystruct spatial_reuse {
856351611Scy	u8 sr_control;
857351611Scy	u8 non_srg_obss_pd_max_offset;
858351611Scy	u8 srg_obss_pd_min_offset;
859351611Scy	u8 srg_obss_pd_max_offset;
860351611Scy	u8 srg_obss_color_bitmap;
861351611Scy	u8 srg_obss_color_partial_bitmap;
862351611Scy};
863351611Scy
864351611Scy/**
865214501Srpaulo * struct hostapd_config - Per-radio interface configuration
866214501Srpaulo */
867214501Srpaulostruct hostapd_config {
868281806Srpaulo	struct hostapd_bss_config **bss, *last_bss;
869214501Srpaulo	size_t num_bss;
870214501Srpaulo
871214501Srpaulo	u16 beacon_int;
872214501Srpaulo	int rts_threshold;
873214501Srpaulo	int fragm_threshold;
874214501Srpaulo	u8 channel;
875289549Srpaulo	u8 acs;
876289549Srpaulo	struct wpa_freq_range_list acs_ch_list;
877346981Scy	int acs_exclude_dfs;
878214501Srpaulo	enum hostapd_hw_mode hw_mode; /* HOSTAPD_MODE_IEEE80211A, .. */
879214501Srpaulo	enum {
880214501Srpaulo		LONG_PREAMBLE = 0,
881214501Srpaulo		SHORT_PREAMBLE = 1
882214501Srpaulo	} preamble;
883214501Srpaulo
884214501Srpaulo	int *supported_rates;
885214501Srpaulo	int *basic_rates;
886346981Scy	unsigned int beacon_rate;
887346981Scy	enum beacon_rate_type rate_type;
888214501Srpaulo
889214501Srpaulo	const struct wpa_driver_ops *driver;
890281806Srpaulo	char *driver_params;
891214501Srpaulo
892214501Srpaulo	int ap_table_max_size;
893214501Srpaulo	int ap_table_expiration_time;
894214501Srpaulo
895289549Srpaulo	unsigned int track_sta_max_num;
896289549Srpaulo	unsigned int track_sta_max_age;
897289549Srpaulo
898214501Srpaulo	char country[3]; /* first two octets: country code as described in
899214501Srpaulo			  * ISO/IEC 3166-1. Third octet:
900214501Srpaulo			  * ' ' (ascii 32): all environments
901214501Srpaulo			  * 'O': Outdoor environemnt only
902214501Srpaulo			  * 'I': Indoor environment only
903346981Scy			  * 'X': Used with noncountry entity ("XXX")
904346981Scy			  * 0x00..0x31: identifying IEEE 802.11 standard
905346981Scy			  *	Annex E table (0x04 = global table)
906214501Srpaulo			  */
907214501Srpaulo
908214501Srpaulo	int ieee80211d;
909214501Srpaulo
910281806Srpaulo	int ieee80211h; /* DFS */
911281806Srpaulo
912281806Srpaulo	/*
913281806Srpaulo	 * Local power constraint is an octet encoded as an unsigned integer in
914281806Srpaulo	 * units of decibels. Invalid value -1 indicates that Power Constraint
915281806Srpaulo	 * element will not be added.
916281806Srpaulo	 */
917281806Srpaulo	int local_pwr_constraint;
918281806Srpaulo
919281806Srpaulo	/* Control Spectrum Management bit */
920281806Srpaulo	int spectrum_mgmt_required;
921281806Srpaulo
922214501Srpaulo	struct hostapd_tx_queue_params tx_queue[NUM_TX_QUEUES];
923214501Srpaulo
924214501Srpaulo	/*
925214501Srpaulo	 * WMM AC parameters, in same order as 802.1D, i.e.
926214501Srpaulo	 * 0 = BE (best effort)
927214501Srpaulo	 * 1 = BK (background)
928214501Srpaulo	 * 2 = VI (video)
929214501Srpaulo	 * 3 = VO (voice)
930214501Srpaulo	 */
931214501Srpaulo	struct hostapd_wmm_ac_params wmm_ac_params[4];
932214501Srpaulo
933214501Srpaulo	int ht_op_mode_fixed;
934214501Srpaulo	u16 ht_capab;
935214501Srpaulo	int ieee80211n;
936214501Srpaulo	int secondary_channel;
937289549Srpaulo	int no_pri_sec_switch;
938252726Srpaulo	int require_ht;
939281806Srpaulo	int obss_interval;
940252726Srpaulo	u32 vht_capab;
941252726Srpaulo	int ieee80211ac;
942252726Srpaulo	int require_vht;
943252726Srpaulo	u8 vht_oper_chwidth;
944252726Srpaulo	u8 vht_oper_centr_freq_seg0_idx;
945252726Srpaulo	u8 vht_oper_centr_freq_seg1_idx;
946346981Scy	u8 ht40_plus_minus_allowed;
947281806Srpaulo
948337817Scy	/* Use driver-generated interface addresses when adding multiple BSSs */
949337817Scy	u8 use_driver_iface_addr;
950337817Scy
951289549Srpaulo#ifdef CONFIG_FST
952289549Srpaulo	struct fst_iface_cfg fst_cfg;
953289549Srpaulo#endif /* CONFIG_FST */
954289549Srpaulo
955281806Srpaulo#ifdef CONFIG_P2P
956281806Srpaulo	u8 p2p_go_ctwindow;
957281806Srpaulo#endif /* CONFIG_P2P */
958281806Srpaulo
959281806Srpaulo#ifdef CONFIG_TESTING_OPTIONS
960281806Srpaulo	double ignore_probe_probability;
961281806Srpaulo	double ignore_auth_probability;
962281806Srpaulo	double ignore_assoc_probability;
963281806Srpaulo	double ignore_reassoc_probability;
964281806Srpaulo	double corrupt_gtk_rekey_mic_probability;
965337817Scy	int ecsa_ie_only;
966281806Srpaulo#endif /* CONFIG_TESTING_OPTIONS */
967281806Srpaulo
968281806Srpaulo#ifdef CONFIG_ACS
969281806Srpaulo	unsigned int acs_num_scans;
970281806Srpaulo	struct acs_bias {
971281806Srpaulo		int channel;
972281806Srpaulo		double bias;
973281806Srpaulo	} *acs_chan_bias;
974281806Srpaulo	unsigned int num_acs_chan_bias;
975281806Srpaulo#endif /* CONFIG_ACS */
976337817Scy
977337817Scy	struct wpabuf *lci;
978337817Scy	struct wpabuf *civic;
979346981Scy	int stationary_ap;
980346981Scy
981346981Scy	int ieee80211ax;
982346981Scy#ifdef CONFIG_IEEE80211AX
983346981Scy	struct he_phy_capabilities_info he_phy_capab;
984346981Scy	struct he_operation he_op;
985346981Scy	struct ieee80211_he_mu_edca_parameter_set he_mu_edca;
986351611Scy	struct spatial_reuse spr;
987351611Scy	u8 he_oper_chwidth;
988351611Scy	u8 he_oper_centr_freq_seg0_idx;
989351611Scy	u8 he_oper_centr_freq_seg1_idx;
990346981Scy#endif /* CONFIG_IEEE80211AX */
991346981Scy
992346981Scy	/* VHT enable/disable config from CHAN_SWITCH */
993346981Scy#define CH_SWITCH_VHT_ENABLED BIT(0)
994346981Scy#define CH_SWITCH_VHT_DISABLED BIT(1)
995346981Scy	unsigned int ch_switch_vht_config;
996346981Scy
997346981Scy	int rssi_reject_assoc_rssi;
998346981Scy	int rssi_reject_assoc_timeout;
999351611Scy
1000351611Scy#ifdef CONFIG_AIRTIME_POLICY
1001351611Scy	enum {
1002351611Scy		AIRTIME_MODE_OFF = 0,
1003351611Scy		AIRTIME_MODE_STATIC = 1,
1004351611Scy		AIRTIME_MODE_DYNAMIC = 2,
1005351611Scy		AIRTIME_MODE_LIMIT = 3,
1006351611Scy		__AIRTIME_MODE_MAX,
1007351611Scy	} airtime_mode;
1008351611Scy	unsigned int airtime_update_interval;
1009351611Scy#define AIRTIME_MODE_MAX (__AIRTIME_MODE_MAX - 1)
1010351611Scy#endif /* CONFIG_AIRTIME_POLICY */
1011214501Srpaulo};
1012214501Srpaulo
1013214501Srpaulo
1014351611Scystatic inline u8 hostapd_get_oper_chwidth(struct hostapd_config *conf)
1015351611Scy{
1016351611Scy#ifdef CONFIG_IEEE80211AX
1017351611Scy	if (conf->ieee80211ax)
1018351611Scy		return conf->he_oper_chwidth;
1019351611Scy#endif /* CONFIG_IEEE80211AX */
1020351611Scy	return conf->vht_oper_chwidth;
1021351611Scy}
1022351611Scy
1023351611Scystatic inline void
1024351611Scyhostapd_set_oper_chwidth(struct hostapd_config *conf, u8 oper_chwidth)
1025351611Scy{
1026351611Scy#ifdef CONFIG_IEEE80211AX
1027351611Scy	if (conf->ieee80211ax)
1028351611Scy		conf->he_oper_chwidth = oper_chwidth;
1029351611Scy#endif /* CONFIG_IEEE80211AX */
1030351611Scy	conf->vht_oper_chwidth = oper_chwidth;
1031351611Scy}
1032351611Scy
1033351611Scystatic inline u8
1034351611Scyhostapd_get_oper_centr_freq_seg0_idx(struct hostapd_config *conf)
1035351611Scy{
1036351611Scy#ifdef CONFIG_IEEE80211AX
1037351611Scy	if (conf->ieee80211ax)
1038351611Scy		return conf->he_oper_centr_freq_seg0_idx;
1039351611Scy#endif /* CONFIG_IEEE80211AX */
1040351611Scy	return conf->vht_oper_centr_freq_seg0_idx;
1041351611Scy}
1042351611Scy
1043351611Scystatic inline void
1044351611Scyhostapd_set_oper_centr_freq_seg0_idx(struct hostapd_config *conf,
1045351611Scy				     u8 oper_centr_freq_seg0_idx)
1046351611Scy{
1047351611Scy#ifdef CONFIG_IEEE80211AX
1048351611Scy	if (conf->ieee80211ax)
1049351611Scy		conf->he_oper_centr_freq_seg0_idx = oper_centr_freq_seg0_idx;
1050351611Scy#endif /* CONFIG_IEEE80211AX */
1051351611Scy	conf->vht_oper_centr_freq_seg0_idx = oper_centr_freq_seg0_idx;
1052351611Scy}
1053351611Scy
1054351611Scystatic inline u8
1055351611Scyhostapd_get_oper_centr_freq_seg1_idx(struct hostapd_config *conf)
1056351611Scy{
1057351611Scy#ifdef CONFIG_IEEE80211AX
1058351611Scy	if (conf->ieee80211ax)
1059351611Scy		return conf->he_oper_centr_freq_seg1_idx;
1060351611Scy#endif /* CONFIG_IEEE80211AX */
1061351611Scy	return conf->vht_oper_centr_freq_seg1_idx;
1062351611Scy}
1063351611Scy
1064351611Scystatic inline void
1065351611Scyhostapd_set_oper_centr_freq_seg1_idx(struct hostapd_config *conf,
1066351611Scy				     u8 oper_centr_freq_seg1_idx)
1067351611Scy{
1068351611Scy#ifdef CONFIG_IEEE80211AX
1069351611Scy	if (conf->ieee80211ax)
1070351611Scy		conf->he_oper_centr_freq_seg1_idx = oper_centr_freq_seg1_idx;
1071351611Scy#endif /* CONFIG_IEEE80211AX */
1072351611Scy	conf->vht_oper_centr_freq_seg1_idx = oper_centr_freq_seg1_idx;
1073351611Scy}
1074351611Scy
1075351611Scy
1076214501Srpauloint hostapd_mac_comp(const void *a, const void *b);
1077214501Srpaulostruct hostapd_config * hostapd_config_defaults(void);
1078214501Srpaulovoid hostapd_config_defaults_bss(struct hostapd_bss_config *bss);
1079351611Scyvoid hostapd_config_free_radius_attr(struct hostapd_radius_attr *attr);
1080281806Srpaulovoid hostapd_config_free_eap_user(struct hostapd_eap_user *user);
1081346981Scyvoid hostapd_config_free_eap_users(struct hostapd_eap_user *user);
1082281806Srpaulovoid hostapd_config_clear_wpa_psk(struct hostapd_wpa_psk **p);
1083281806Srpaulovoid hostapd_config_free_bss(struct hostapd_bss_config *conf);
1084214501Srpaulovoid hostapd_config_free(struct hostapd_config *conf);
1085214501Srpauloint hostapd_maclist_found(struct mac_acl_entry *list, int num_entries,
1086337817Scy			  const u8 *addr, struct vlan_description *vlan_id);
1087214501Srpauloint hostapd_rate_found(int *list, int rate);
1088214501Srpauloconst u8 * hostapd_get_psk(const struct hostapd_bss_config *conf,
1089281806Srpaulo			   const u8 *addr, const u8 *p2p_dev_addr,
1090346981Scy			   const u8 *prev_psk, int *vlan_id);
1091214501Srpauloint hostapd_setup_wpa_psk(struct hostapd_bss_config *conf);
1092337817Scyint hostapd_vlan_valid(struct hostapd_vlan *vlan,
1093337817Scy		       struct vlan_description *vlan_desc);
1094214501Srpauloconst char * hostapd_get_vlan_id_ifname(struct hostapd_vlan *vlan,
1095214501Srpaulo					int vlan_id);
1096252726Srpaulostruct hostapd_radius_attr *
1097252726Srpaulohostapd_config_get_radius_attr(struct hostapd_radius_attr *attr, u8 type);
1098351611Scystruct hostapd_radius_attr * hostapd_parse_radius_attr(const char *value);
1099281806Srpauloint hostapd_config_check(struct hostapd_config *conf, int full_config);
1100281806Srpaulovoid hostapd_set_security_params(struct hostapd_bss_config *bss,
1101281806Srpaulo				 int full_config);
1102346981Scyint hostapd_sae_pw_id_in_use(struct hostapd_bss_config *conf);
1103214501Srpaulo
1104214501Srpaulo#endif /* HOSTAPD_CONFIG_H */
1105