• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * hostapd / Initialization and configuration
3  * Copyright (c) 2002-2009, 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 #include "common/defs.h"
13 #include "ap_config.h"
14 
15 struct wpa_driver_ops;
16 struct wpa_ctrl_dst;
17 struct radius_server_data;
18 struct upnp_wps_device_sm;
19 struct hostapd_data;
20 struct sta_info;
21 struct hostap_sta_driver_data;
22 struct ieee80211_ht_capabilities;
23 struct full_dynamic_vlan;
24 enum wps_event;
25 union wps_event_data;
26 
27 struct hostapd_iface;
28 struct hostapd_dynamic_iface;
29 
30 struct hapd_interfaces {
31 	int (*reload_config)(struct hostapd_iface *iface);
32 	struct hostapd_config * (*config_read_cb)(const char *config_fname);
33 	int (*ctrl_iface_init)(struct hostapd_data *hapd);
34 	void (*ctrl_iface_deinit)(struct hostapd_data *hapd);
35 	int (*for_each_interface)(struct hapd_interfaces *interfaces,
36 				  int (*cb)(struct hostapd_iface *iface,
37 					    void *ctx), void *ctx);
38 	int (*driver_init)(struct hostapd_iface *iface);
39 
40 	size_t count;
41 	size_t count_dynamic;
42 	int global_ctrl_sock;
43 	char *global_iface_path;
44 	char *global_iface_name;
45 	gid_t ctrl_iface_group;
46 	struct hostapd_iface **iface;
47 	struct hostapd_dynamic_iface **dynamic_iface;
48 };
49 
50 enum hostapd_chan_status {
51 	HOSTAPD_CHAN_VALID = 0, /* channel is ready */
52 	HOSTAPD_CHAN_INVALID = 1, /* no usable channel found */
53 	HOSTAPD_CHAN_ACS = 2, /* ACS work being performed */
54 };
55 
56 struct hostapd_probereq_cb {
57 	int (*cb)(void *ctx, const u8 *sa, const u8 *da, const u8 *bssid,
58 		  const u8 *ie, size_t ie_len, int ssi_signal);
59 	void *ctx;
60 };
61 
62 #define HOSTAPD_RATE_BASIC 0x00000001
63 
64 struct hostapd_rate_data {
65 	int rate; /* rate in 100 kbps */
66 	int flags; /* HOSTAPD_RATE_ flags */
67 };
68 
69 struct hostapd_frame_info {
70 	u32 channel;
71 	u32 datarate;
72 	int ssi_signal; /* dBm */
73 };
74 
75 enum wps_status {
76 	WPS_STATUS_SUCCESS = 1,
77 	WPS_STATUS_FAILURE
78 };
79 
80 enum pbc_status {
81 	WPS_PBC_STATUS_DISABLE,
82 	WPS_PBC_STATUS_ACTIVE,
83 	WPS_PBC_STATUS_TIMEOUT,
84 	WPS_PBC_STATUS_OVERLAP
85 };
86 
87 struct wps_stat {
88 	enum wps_status status;
89 	enum wps_error_indication failure_reason;
90 	enum pbc_status pbc_status;
91 	u8 peer_addr[ETH_ALEN];
92 };
93 
94 
95 /**
96  * struct hostapd_data - hostapd per-BSS data structure
97  */
98 struct hostapd_data {
99 	struct hostapd_iface *iface;
100 	struct hostapd_config *iconf;
101 	struct hostapd_bss_config *conf;
102 	int interface_added; /* virtual interface added for this BSS */
103 
104 	u8 own_addr[ETH_ALEN];
105 
106 	int num_sta; /* number of entries in sta_list */
107 	struct sta_info *sta_list; /* STA info list head */
108 #define STA_HASH_SIZE 256
109 #define STA_HASH(sta) (sta[5])
110 	struct sta_info *sta_hash[STA_HASH_SIZE];
111 
112 	/*
113 	 * Bitfield for indicating which AIDs are allocated. Only AID values
114 	 * 1-2007 are used and as such, the bit at index 0 corresponds to AID
115 	 * 1.
116 	 */
117 #define AID_WORDS ((2008 + 31) / 32)
118 	u32 sta_aid[AID_WORDS];
119 
120 	const struct wpa_driver_ops *driver;
121 	void *drv_priv;
122 
123 	void (*new_assoc_sta_cb)(struct hostapd_data *hapd,
124 				 struct sta_info *sta, int reassoc);
125 
126 	void *msg_ctx; /* ctx for wpa_msg() calls */
127 	void *msg_ctx_parent; /* parent interface ctx for wpa_msg() calls */
128 
129 	struct radius_client_data *radius;
130 	u32 acct_session_id_hi, acct_session_id_lo;
131 	struct radius_das_data *radius_das;
132 
133 	struct iapp_data *iapp;
134 
135 	struct hostapd_cached_radius_acl *acl_cache;
136 	struct hostapd_acl_query_data *acl_queries;
137 
138 	struct wpa_authenticator *wpa_auth;
139 	struct eapol_authenticator *eapol_auth;
140 
141 	struct rsn_preauth_interface *preauth_iface;
142 	time_t michael_mic_failure;
143 	int michael_mic_failures;
144 	int tkip_countermeasures;
145 
146 	int ctrl_sock;
147 	struct wpa_ctrl_dst *ctrl_dst;
148 
149 	void *ssl_ctx;
150 	void *eap_sim_db_priv;
151 	struct radius_server_data *radius_srv;
152 
153 	int parameter_set_count;
154 
155 	/* Time Advertisement */
156 	u8 time_update_counter;
157 	struct wpabuf *time_adv;
158 
159 #ifdef CONFIG_FULL_DYNAMIC_VLAN
160 	struct full_dynamic_vlan *full_dynamic_vlan;
161 #endif /* CONFIG_FULL_DYNAMIC_VLAN */
162 
163 	struct l2_packet_data *l2;
164 	struct wps_context *wps;
165 
166 	int beacon_set_done;
167 	struct wpabuf *wps_beacon_ie;
168 	struct wpabuf *wps_probe_resp_ie;
169 #ifdef CONFIG_WPS
170 	unsigned int ap_pin_failures;
171 	unsigned int ap_pin_failures_consecutive;
172 	struct upnp_wps_device_sm *wps_upnp;
173 	unsigned int ap_pin_lockout_time;
174 
175 	struct wps_stat wps_stats;
176 #endif /* CONFIG_WPS */
177 
178 	struct hostapd_probereq_cb *probereq_cb;
179 	size_t num_probereq_cb;
180 
181 	void (*public_action_cb)(void *ctx, const u8 *buf, size_t len,
182 				 int freq);
183 	void *public_action_cb_ctx;
184 	void (*public_action_cb2)(void *ctx, const u8 *buf, size_t len,
185 				  int freq);
186 	void *public_action_cb2_ctx;
187 
188 	int (*vendor_action_cb)(void *ctx, const u8 *buf, size_t len,
189 				int freq);
190 	void *vendor_action_cb_ctx;
191 
192 	void (*wps_reg_success_cb)(void *ctx, const u8 *mac_addr,
193 				   const u8 *uuid_e);
194 	void *wps_reg_success_cb_ctx;
195 
196 	void (*wps_event_cb)(void *ctx, enum wps_event event,
197 			     union wps_event_data *data);
198 	void *wps_event_cb_ctx;
199 
200 	void (*sta_authorized_cb)(void *ctx, const u8 *mac_addr,
201 				  int authorized, const u8 *p2p_dev_addr);
202 	void *sta_authorized_cb_ctx;
203 
204 	void (*setup_complete_cb)(void *ctx);
205 	void *setup_complete_cb_ctx;
206 
207 	void (*new_psk_cb)(void *ctx, const u8 *mac_addr,
208 			   const u8 *p2p_dev_addr, const u8 *psk,
209 			   size_t psk_len);
210 	void *new_psk_cb_ctx;
211 
212 #ifdef CONFIG_P2P
213 	struct p2p_data *p2p;
214 	struct p2p_group *p2p_group;
215 	struct wpabuf *p2p_beacon_ie;
216 	struct wpabuf *p2p_probe_resp_ie;
217 
218 	/* Number of non-P2P association stations */
219 	int num_sta_no_p2p;
220 
221 	/* Periodic NoA (used only when no non-P2P clients in the group) */
222 	int noa_enabled;
223 	int noa_start;
224 	int noa_duration;
225 #endif /* CONFIG_P2P */
226 #ifdef CONFIG_INTERWORKING
227 	size_t gas_frag_limit;
228 #endif /* CONFIG_INTERWORKING */
229 
230 #ifdef CONFIG_SQLITE
231 	struct hostapd_eap_user tmp_eap_user;
232 #endif /* CONFIG_SQLITE */
233 
234 #ifdef CONFIG_SAE
235 	/** Key used for generating SAE anti-clogging tokens */
236 	u8 sae_token_key[8];
237 	os_time_t last_sae_token_key_update;
238 #endif /* CONFIG_SAE */
239 };
240 
241 
242 /**
243  * struct hostapd_iface - hostapd per-interface data structure
244  */
245 struct hostapd_iface {
246 	struct hapd_interfaces *interfaces;
247 	void *owner;
248 	char *config_fname;
249 	struct hostapd_config *conf;
250 
251 	size_t num_bss;
252 	struct hostapd_data **bss;
253 
254 	int num_ap; /* number of entries in ap_list */
255 	struct ap_info *ap_list; /* AP info list head */
256 	struct ap_info *ap_hash[STA_HASH_SIZE];
257 
258 	unsigned int drv_flags;
259 
260 	/*
261 	 * A bitmap of supported protocols for probe response offload. See
262 	 * struct wpa_driver_capa in driver.h
263 	 */
264 	unsigned int probe_resp_offloads;
265 
266 	/* extended capabilities supported by the driver */
267 	const u8 *extended_capa, *extended_capa_mask;
268 	unsigned int extended_capa_len;
269 
270 	unsigned int drv_max_acl_mac_addrs;
271 
272 	struct hostapd_hw_modes *hw_features;
273 	int num_hw_features;
274 	struct hostapd_hw_modes *current_mode;
275 	/* Rates that are currently used (i.e., filtered copy of
276 	 * current_mode->channels */
277 	int num_rates;
278 	struct hostapd_rate_data *current_rates;
279 	int *basic_rates;
280 	int freq;
281 
282 	u16 hw_flags;
283 
284 	/* Number of associated Non-ERP stations (i.e., stations using 802.11b
285 	 * in 802.11g BSS) */
286 	int num_sta_non_erp;
287 
288 	/* Number of associated stations that do not support Short Slot Time */
289 	int num_sta_no_short_slot_time;
290 
291 	/* Number of associated stations that do not support Short Preamble */
292 	int num_sta_no_short_preamble;
293 
294 	int olbc; /* Overlapping Legacy BSS Condition */
295 
296 	/* Number of HT associated stations that do not support greenfield */
297 	int num_sta_ht_no_gf;
298 
299 	/* Number of associated non-HT stations */
300 	int num_sta_no_ht;
301 
302 	/* Number of HT associated stations 20 MHz */
303 	int num_sta_ht_20mhz;
304 
305 	/* Overlapping BSS information */
306 	int olbc_ht;
307 
308 	u16 ht_op_mode;
309 
310 	/* surveying helpers */
311 
312 	/* number of channels surveyed */
313 	unsigned int chans_surveyed;
314 
315 	/* lowest observed noise floor in dBm */
316 	s8 lowest_nf;
317 
318 #ifdef CONFIG_ACS
319 	unsigned int acs_num_completed_scans;
320 #endif /* CONFIG_ACS */
321 
322 	void (*scan_cb)(struct hostapd_iface *iface);
323 };
324 
325 /**
326  * struct hostapd_dynamic_iface - hostapd per dynamically allocated
327  * or added interface data structure
328  */
329 struct hostapd_dynamic_iface {
330 	char parent[IFNAMSIZ + 1];
331 	char iface[IFNAMSIZ + 1];
332 	unsigned int usage;
333 };
334 
335 /* hostapd.c */
336 int hostapd_for_each_interface(struct hapd_interfaces *interfaces,
337 			       int (*cb)(struct hostapd_iface *iface,
338 					 void *ctx), void *ctx);
339 int hostapd_reload_config(struct hostapd_iface *iface);
340 struct hostapd_data *
341 hostapd_alloc_bss_data(struct hostapd_iface *hapd_iface,
342 		       struct hostapd_config *conf,
343 		       struct hostapd_bss_config *bss);
344 int hostapd_setup_interface(struct hostapd_iface *iface);
345 int hostapd_setup_interface_complete(struct hostapd_iface *iface, int err);
346 void hostapd_interface_deinit(struct hostapd_iface *iface);
347 void hostapd_interface_free(struct hostapd_iface *iface);
348 void hostapd_new_assoc_sta(struct hostapd_data *hapd, struct sta_info *sta,
349 			   int reassoc);
350 void hostapd_interface_deinit_free(struct hostapd_iface *iface);
351 int hostapd_enable_iface(struct hostapd_iface *hapd_iface);
352 int hostapd_reload_iface(struct hostapd_iface *hapd_iface);
353 int hostapd_disable_iface(struct hostapd_iface *hapd_iface);
354 int hostapd_add_iface(struct hapd_interfaces *ifaces, char *buf);
355 int hostapd_remove_iface(struct hapd_interfaces *ifaces, char *buf);
356 
357 /* utils.c */
358 int hostapd_register_probereq_cb(struct hostapd_data *hapd,
359 				 int (*cb)(void *ctx, const u8 *sa,
360 					   const u8 *da, const u8 *bssid,
361 					   const u8 *ie, size_t ie_len,
362 					   int ssi_signal),
363 				 void *ctx);
364 void hostapd_prune_associations(struct hostapd_data *hapd, const u8 *addr);
365 
366 /* drv_callbacks.c (TODO: move to somewhere else?) */
367 int hostapd_notif_assoc(struct hostapd_data *hapd, const u8 *addr,
368 			const u8 *ie, size_t ielen, int reassoc);
369 void hostapd_notif_disassoc(struct hostapd_data *hapd, const u8 *addr);
370 void hostapd_event_sta_low_ack(struct hostapd_data *hapd, const u8 *addr);
371 void hostapd_event_connect_failed_reason(struct hostapd_data *hapd,
372 					 const u8 *addr, int reason_code);
373 int hostapd_probe_req_rx(struct hostapd_data *hapd, const u8 *sa, const u8 *da,
374 			 const u8 *bssid, const u8 *ie, size_t ie_len,
375 			 int ssi_signal);
376 void hostapd_event_ch_switch(struct hostapd_data *hapd, int freq, int ht,
377 			     int offset);
378 
379 const struct hostapd_eap_user *
380 hostapd_get_eap_user(struct hostapd_data *hapd, const u8 *identity,
381 		     size_t identity_len, int phase2);
382 
383 #endif /* HOSTAPD_H */
384