2 * wpa_supplicant - Internal definitions
3 * Copyright (c) 2003-2010, Jouni Malinen <j@w1.fi>
5 * This software may be distributed under the terms of the BSD license.
6 * See README for more details.
9 #ifndef WPA_SUPPLICANT_I_H
10 #define WPA_SUPPLICANT_I_H
12 #include "utils/list.h"
13 #include "common/defs.h"
14 #include "config_ssid.h"
16 extern const char *wpa_supplicant_version
;
17 extern const char *wpa_supplicant_license
;
18 #ifndef CONFIG_NO_STDOUT_DEBUG
19 extern const char *wpa_supplicant_full_license1
;
20 extern const char *wpa_supplicant_full_license2
;
21 extern const char *wpa_supplicant_full_license3
;
22 extern const char *wpa_supplicant_full_license4
;
23 extern const char *wpa_supplicant_full_license5
;
24 #endif /* CONFIG_NO_STDOUT_DEBUG */
27 struct wpa_supplicant
;
31 struct wpa_scan_results
;
32 struct hostapd_hw_modes
;
33 struct wpa_driver_associate_params
;
36 * Forward declarations of private structures used within the ctrl_iface
37 * backends. Other parts of wpa_supplicant do not have access to data stored in
40 struct ctrl_iface_priv
;
41 struct ctrl_iface_global_priv
;
42 struct wpas_dbus_priv
;
45 * struct wpa_interface - Parameters for wpa_supplicant_add_iface()
47 struct wpa_interface
{
49 * confname - Configuration name (file or profile) name
51 * This can also be %NULL when a configuration file is not used. In
52 * that case, ctrl_interface must be set to allow the interface to be
58 * ctrl_interface - Control interface parameter
60 * If a configuration file is not used, this variable can be used to
61 * set the ctrl_interface parameter that would have otherwise been read
62 * from the configuration file. If both confname and ctrl_interface are
63 * set, ctrl_interface is used to override the value from configuration
66 const char *ctrl_interface
;
69 * driver - Driver interface name, or %NULL to use the default driver
74 * driver_param - Driver interface parameters
76 * If a configuration file is not used, this variable can be used to
77 * set the driver_param parameters that would have otherwise been read
78 * from the configuration file. If both confname and driver_param are
79 * set, driver_param is used to override the value from configuration
82 const char *driver_param
;
85 * ifname - Interface name
90 * bridge_ifname - Optional bridge interface name
92 * If the driver interface (ifname) is included in a Linux bridge
93 * device, the bridge interface may need to be used for receiving EAPOL
94 * frames. This can be enabled by setting this variable to enable
95 * receiving of EAPOL frames from an additional interface.
97 const char *bridge_ifname
;
101 * struct wpa_params - Parameters for wpa_supplicant_init()
105 * daemonize - Run %wpa_supplicant in the background
110 * wait_for_monitor - Wait for a monitor program before starting
112 int wait_for_monitor
;
115 * pid_file - Path to a PID (process ID) file
117 * If this and daemonize are set, process ID of the background process
118 * will be written to the specified file.
123 * wpa_debug_level - Debugging verbosity level (e.g., MSG_INFO)
128 * wpa_debug_show_keys - Whether keying material is included in debug
130 * This parameter can be used to allow keying material to be included
131 * in debug messages. This is a security risk and this option should
132 * not be enabled in normal configuration. If needed during
133 * development or while troubleshooting, this option can provide more
134 * details for figuring out what is happening.
136 int wpa_debug_show_keys
;
139 * wpa_debug_timestamp - Whether to include timestamp in debug messages
141 int wpa_debug_timestamp
;
144 * ctrl_interface - Global ctrl_iface path/parameter
146 char *ctrl_interface
;
149 * dbus_ctrl_interface - Enable the DBus control interface
151 int dbus_ctrl_interface
;
154 * wpa_debug_file_path - Path of debug file or %NULL to use stdout
156 const char *wpa_debug_file_path
;
159 * wpa_debug_syslog - Enable log output through syslog
161 int wpa_debug_syslog
;
164 * override_driver - Optional driver parameter override
166 * This parameter can be used to override the driver parameter in
167 * dynamic interface addition to force a specific driver wrapper to be
170 char *override_driver
;
173 * override_ctrl_interface - Optional ctrl_interface override
175 * This parameter can be used to override the ctrl_interface parameter
176 * in dynamic interface addition to force a control interface to be
179 char *override_ctrl_interface
;
182 * entropy_file - Optional entropy file
184 * This parameter can be used to configure wpa_supplicant to maintain
185 * its internal entropy store over restarts.
190 struct p2p_srv_bonjour
{
192 struct wpabuf
*query
;
196 struct p2p_srv_upnp
{
202 struct wpa_freq_range
{
209 * struct wpa_global - Internal, global data for all %wpa_supplicant interfaces
211 * This structure is initialized by calling wpa_supplicant_init() when starting
215 struct wpa_supplicant
*ifaces
;
216 struct wpa_params params
;
217 struct ctrl_iface_global_priv
*ctrl_iface
;
218 struct wpas_dbus_priv
*dbus
;
221 struct os_time suspend_time
;
222 struct p2p_data
*p2p
;
223 struct wpa_supplicant
*p2p_group_formation
;
224 u8 p2p_dev_addr
[ETH_ALEN
];
225 struct dl_list p2p_srv_bonjour
; /* struct p2p_srv_bonjour */
226 struct dl_list p2p_srv_upnp
; /* struct p2p_srv_upnp */
228 int cross_connection
;
229 struct wpa_freq_range
*p2p_disallow_freq
;
230 unsigned int num_p2p_disallow_freq
;
234 enum offchannel_send_action_result
{
235 OFFCHANNEL_SEND_ACTION_SUCCESS
/* Frame was send and acknowledged */,
236 OFFCHANNEL_SEND_ACTION_NO_ACK
/* Frame was sent, but not acknowledged
238 OFFCHANNEL_SEND_ACTION_FAILED
/* Frame was not sent due to a failure */
242 * struct wpa_supplicant - Internal data for wpa_supplicant interface
244 * This structure contains the internal data for core wpa_supplicant code. This
245 * should be only used directly from the core code. However, a pointer to this
246 * data is used from other files as an arbitrary context pointer in calls to
249 struct wpa_supplicant
{
250 struct wpa_global
*global
;
251 struct wpa_supplicant
*parent
;
252 struct wpa_supplicant
*next
;
253 struct l2_packet_data
*l2
;
254 struct l2_packet_data
*l2_br
;
255 unsigned char own_addr
[ETH_ALEN
];
257 #ifdef CONFIG_CTRL_IFACE_DBUS
259 #endif /* CONFIG_CTRL_IFACE_DBUS */
260 #ifdef CONFIG_CTRL_IFACE_DBUS_NEW
262 char *dbus_groupobj_path
;
263 #endif /* CONFIG_CTRL_IFACE_DBUS_NEW */
264 char bridge_ifname
[16];
267 struct wpa_config
*conf
;
269 os_time_t last_michael_mic_error
;
271 u8 pending_bssid
[ETH_ALEN
]; /* If wpa_state == WPA_ASSOCIATING, this
272 * field contains the target BSSID. */
273 int reassociate
; /* reassociation requested */
274 int disconnected
; /* all connections disabled; i.e., do no reassociate
275 * before this has been cleared */
276 struct wpa_ssid
*current_ssid
;
277 struct wpa_bss
*current_bss
;
278 int ap_ies_from_associnfo
;
279 unsigned int assoc_freq
;
281 /* Selected configuration (based on Beacon/ProbeResp WPA IE) */
286 int mgmt_group_cipher
;
288 void *drv_priv
; /* private data used by driver_ops */
289 void *global_drv_priv
;
292 size_t bssid_filter_count
;
294 /* previous scan was wildcard when interleaving between
295 * wildcard scans and specific SSID scan when max_ssids=1 */
296 int prev_scan_wildcard
;
297 struct wpa_ssid
*prev_scan_ssid
; /* previously scanned SSID;
298 * NULL = not yet initialized (start
299 * with wildcard SSID)
300 * WILDCARD_SSID_SCAN = wildcard
301 * SSID was used in the previous scan
303 #define WILDCARD_SSID_SCAN ((struct wpa_ssid *) 1)
305 struct wpa_ssid
*prev_sched_ssid
; /* last SSID used in sched scan */
306 int sched_scan_timeout
;
307 int sched_scan_interval
;
308 int first_sched_scan
;
309 int sched_scan_timed_out
;
311 void (*scan_res_handler
)(struct wpa_supplicant
*wpa_s
,
312 struct wpa_scan_results
*scan_res
);
313 struct dl_list bss
; /* struct wpa_bss::list */
314 struct dl_list bss_id
; /* struct wpa_bss::list_id */
316 unsigned int bss_update_idx
;
317 unsigned int bss_next_id
;
319 struct wpa_driver_ops
*driver
;
320 int interface_removed
; /* whether the network interface has been
323 struct eapol_sm
*eapol
;
325 struct ctrl_iface_priv
*ctrl_iface
;
327 enum wpa_states wpa_state
;
331 int reassociated_connection
;
333 int eapol_received
; /* number of EAPOL packets received after the
334 * previous association event */
336 struct scard_data
*scard
;
340 #endif /* PCSC_FUNCS */
342 unsigned char last_eapol_src
[ETH_ALEN
];
346 struct wpa_blacklist
*blacklist
;
348 int scan_req
; /* manual scan request; this forces a scan even if there
349 * are no enabled networks in the configuration */
350 int scan_runs
; /* number of scan runs since WPS was started */
351 int *next_scan_freqs
;
352 int scan_interval
; /* time in sec between scans to find suitable AP */
353 int normal_scans
; /* normal scans run before sched_scan */
355 unsigned int drv_flags
;
358 * A bitmap of supported protocols for probe response offload. See
359 * struct wpa_driver_capa in driver.h
361 unsigned int probe_resp_offloads
;
364 int max_sched_scan_ssids
;
365 int sched_scan_supported
;
366 unsigned int max_match_sets
;
367 unsigned int max_remain_on_chan
;
368 unsigned int max_stations
;
370 int pending_mic_error_report
;
371 int pending_mic_error_pairwise
;
372 int mic_errors_seen
; /* Michael MIC errors with the current PTK */
374 struct wps_context
*wps
;
375 int wps_success
; /* WPS success event received */
376 struct wps_er
*wps_er
;
377 int blacklist_cleared
;
379 struct wpabuf
*pending_eapol_rx
;
380 struct os_time pending_eapol_rx_time
;
381 u8 pending_eapol_rx_src
[ETH_ALEN
];
383 struct ibss_rsn
*ibss_rsn
;
395 u8 assoc_req_ie
[200];
396 size_t assoc_req_ie_len
;
399 u8 mobility_domain
[2];
402 u8 prev_bssid
[ETH_ALEN
];
407 int sa_query_count
; /* number of pending SA Query requests;
408 * 0 = no SA Query in progress */
409 int sa_query_timed_out
;
410 u8
*sa_query_trans_id
; /* buffer of WLAN_SA_QUERY_TR_ID_LEN *
411 * sa_query_count octets of pending
412 * SA Query transaction identifiers */
413 struct os_time sa_query_start
;
415 #endif /* CONFIG_SME */
418 struct hostapd_iface
*ap_iface
;
419 void (*ap_configured_cb
)(void *ctx
, void *data
);
420 void *ap_configured_cb_ctx
;
421 void *ap_configured_cb_data
;
422 #endif /* CONFIG_AP */
424 unsigned int off_channel_freq
;
425 struct wpabuf
*pending_action_tx
;
426 u8 pending_action_src
[ETH_ALEN
];
427 u8 pending_action_dst
[ETH_ALEN
];
428 u8 pending_action_bssid
[ETH_ALEN
];
429 unsigned int pending_action_freq
;
430 int pending_action_no_cck
;
431 int pending_action_without_roc
;
432 void (*pending_action_tx_status_cb
)(struct wpa_supplicant
*wpa_s
,
433 unsigned int freq
, const u8
*dst
,
434 const u8
*src
, const u8
*bssid
,
435 const u8
*data
, size_t data_len
,
436 enum offchannel_send_action_result
438 unsigned int roc_waiting_drv_freq
;
439 int action_tx_wait_time
;
442 struct p2p_go_neg_results
*go_params
;
443 int create_p2p_iface
;
444 u8 pending_interface_addr
[ETH_ALEN
];
445 char pending_interface_name
[100];
446 int pending_interface_type
;
448 unsigned int pending_listen_freq
;
449 unsigned int pending_listen_duration
;
451 NOT_P2P_GROUP_INTERFACE
,
452 P2P_GROUP_INTERFACE_PENDING
,
453 P2P_GROUP_INTERFACE_GO
,
454 P2P_GROUP_INTERFACE_CLIENT
455 } p2p_group_interface
;
456 struct p2p_group
*p2p_group
;
457 int p2p_long_listen
; /* remaining time in long Listen state in ms */
460 u8 p2p_auth_invite
[ETH_ALEN
];
461 int p2p_sd_over_ctrl_iface
;
462 int p2p_in_provisioning
;
463 int pending_invite_ssid_id
;
464 int show_group_started
;
465 u8 go_dev_addr
[ETH_ALEN
];
466 int pending_pd_before_join
;
467 u8 pending_join_iface_addr
[ETH_ALEN
];
468 u8 pending_join_dev_addr
[ETH_ALEN
];
469 int pending_join_wps_method
;
470 int p2p_join_scan_count
;
474 * Whether cross connection is disallowed by the AP to which this
475 * interface is associated (only valid if there is an association).
477 int cross_connect_disallowed
;
480 * Whether this P2P group is configured to use cross connection (only
481 * valid if this is P2P GO interface). The actual cross connect packet
482 * forwarding may not be configured depending on the uplink status.
484 int cross_connect_enabled
;
486 /* Whether cross connection forwarding is in use at the moment. */
487 int cross_connect_in_use
;
490 * Uplink interface name for cross connection
492 char cross_connect_uplink
[100];
495 P2P_GROUP_REMOVAL_UNKNOWN
,
496 P2P_GROUP_REMOVAL_REQUESTED
,
497 P2P_GROUP_REMOVAL_IDLE_TIMEOUT
,
498 P2P_GROUP_REMOVAL_UNAVAILABLE
501 unsigned int p2p_cb_on_scan_complete
:1;
502 #endif /* CONFIG_P2P */
504 struct wpa_ssid
*bgscan_ssid
;
505 const struct bgscan_ops
*bgscan
;
508 struct wpa_ssid
*connect_without_scan
;
512 unsigned int wps_freq
;
513 int wps_fragment_size
;
514 int auto_reconnect_disabled
;
516 /* Channel preferences for AP/P2P GO use */
519 int best_overall_freq
;
521 struct gas_query
*gas
;
523 #ifdef CONFIG_INTERWORKING
524 unsigned int fetch_anqp_in_progress
:1;
525 unsigned int network_select
:1;
526 unsigned int auto_select
:1;
527 #endif /* CONFIG_INTERWORKING */
528 unsigned int drv_capa_known
;
531 struct hostapd_hw_modes
*modes
;
540 /* wpa_supplicant.c */
541 void wpa_supplicant_apply_ht_overrides(
542 struct wpa_supplicant
*wpa_s
, struct wpa_ssid
*ssid
,
543 struct wpa_driver_associate_params
*params
);
545 int wpa_set_wep_keys(struct wpa_supplicant
*wpa_s
, struct wpa_ssid
*ssid
);
547 int wpa_supplicant_reload_configuration(struct wpa_supplicant
*wpa_s
);
549 const char * wpa_supplicant_state_txt(enum wpa_states state
);
550 int wpa_supplicant_update_mac_addr(struct wpa_supplicant
*wpa_s
);
551 int wpa_supplicant_driver_init(struct wpa_supplicant
*wpa_s
);
552 int wpa_supplicant_set_suites(struct wpa_supplicant
*wpa_s
,
553 struct wpa_bss
*bss
, struct wpa_ssid
*ssid
,
554 u8
*wpa_ie
, size_t *wpa_ie_len
);
555 void wpa_supplicant_associate(struct wpa_supplicant
*wpa_s
,
557 struct wpa_ssid
*ssid
);
558 void wpa_supplicant_set_non_wpa_policy(struct wpa_supplicant
*wpa_s
,
559 struct wpa_ssid
*ssid
);
560 void wpa_supplicant_initiate_eapol(struct wpa_supplicant
*wpa_s
);
561 void wpa_clear_keys(struct wpa_supplicant
*wpa_s
, const u8
*addr
);
562 void wpa_supplicant_req_auth_timeout(struct wpa_supplicant
*wpa_s
,
564 void wpa_supplicant_set_state(struct wpa_supplicant
*wpa_s
,
565 enum wpa_states state
);
566 struct wpa_ssid
* wpa_supplicant_get_ssid(struct wpa_supplicant
*wpa_s
);
567 const char * wpa_supplicant_get_eap_mode(struct wpa_supplicant
*wpa_s
);
568 void wpa_supplicant_cancel_auth_timeout(struct wpa_supplicant
*wpa_s
);
569 void wpa_supplicant_deauthenticate(struct wpa_supplicant
*wpa_s
,
571 void wpa_supplicant_disassociate(struct wpa_supplicant
*wpa_s
,
574 void wpa_supplicant_enable_network(struct wpa_supplicant
*wpa_s
,
575 struct wpa_ssid
*ssid
);
576 void wpa_supplicant_disable_network(struct wpa_supplicant
*wpa_s
,
577 struct wpa_ssid
*ssid
);
578 void wpa_supplicant_select_network(struct wpa_supplicant
*wpa_s
,
579 struct wpa_ssid
*ssid
);
580 int wpa_supplicant_set_ap_scan(struct wpa_supplicant
*wpa_s
,
582 int wpa_supplicant_set_bss_expiration_age(struct wpa_supplicant
*wpa_s
,
583 unsigned int expire_age
);
584 int wpa_supplicant_set_bss_expiration_count(struct wpa_supplicant
*wpa_s
,
585 unsigned int expire_count
);
586 int wpa_supplicant_set_debug_params(struct wpa_global
*global
,
587 int debug_level
, int debug_timestamp
,
588 int debug_show_keys
);
590 void wpa_show_license(void);
592 struct wpa_supplicant
* wpa_supplicant_add_iface(struct wpa_global
*global
,
593 struct wpa_interface
*iface
);
594 int wpa_supplicant_remove_iface(struct wpa_global
*global
,
595 struct wpa_supplicant
*wpa_s
,
597 struct wpa_supplicant
* wpa_supplicant_get_iface(struct wpa_global
*global
,
599 struct wpa_global
* wpa_supplicant_init(struct wpa_params
*params
);
600 int wpa_supplicant_run(struct wpa_global
*global
);
601 void wpa_supplicant_deinit(struct wpa_global
*global
);
603 int wpa_supplicant_scard_init(struct wpa_supplicant
*wpa_s
,
604 struct wpa_ssid
*ssid
);
605 void wpa_supplicant_terminate_proc(struct wpa_global
*global
);
606 void wpa_supplicant_rx_eapol(void *ctx
, const u8
*src_addr
,
607 const u8
*buf
, size_t len
);
608 enum wpa_key_mgmt
key_mgmt2driver(int key_mgmt
);
609 enum wpa_cipher
cipher_suite2driver(int cipher
);
610 void wpa_supplicant_update_config(struct wpa_supplicant
*wpa_s
);
611 void wpa_supplicant_clear_status(struct wpa_supplicant
*wpa_s
);
612 void wpas_connection_failed(struct wpa_supplicant
*wpa_s
, const u8
*bssid
);
613 int wpas_driver_bss_selection(struct wpa_supplicant
*wpa_s
);
616 void wpa_supplicant_mark_disassoc(struct wpa_supplicant
*wpa_s
);
617 int wpa_supplicant_connect(struct wpa_supplicant
*wpa_s
,
618 struct wpa_bss
*selected
,
619 struct wpa_ssid
*ssid
);
620 void wpa_supplicant_stop_countermeasures(void *eloop_ctx
, void *sock_ctx
);
621 void wpa_supplicant_delayed_mic_error_report(void *eloop_ctx
, void *sock_ctx
);
624 int eap_register_methods(void);
627 * Utility method to tell if a given network is a persistent group
628 * @ssid: Network object
629 * Returns: 1 if network is a persistent group, 0 otherwise
631 static inline int network_is_persistent_group(struct wpa_ssid
*ssid
)
633 return ((ssid
->disabled
== 2) || ssid
->p2p_persistent_group
);
636 #endif /* WPA_SUPPLICANT_I_H */