2008-02-27 20:34:43 -05:00
|
|
|
/*
|
|
|
|
* hostapd / Initialization and configuration
|
2014-11-29 14:28:24 -05:00
|
|
|
* Copyright (c) 2002-2014, Jouni Malinen <j@w1.fi>
|
2008-02-27 20:34:43 -05:00
|
|
|
*
|
2012-02-11 09:46:35 -05:00
|
|
|
* This software may be distributed under the terms of the BSD license.
|
|
|
|
* See README for more details.
|
2008-02-27 20:34:43 -05:00
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef HOSTAPD_H
|
|
|
|
#define HOSTAPD_H
|
|
|
|
|
2009-12-24 13:41:30 -05:00
|
|
|
#include "common/defs.h"
|
2014-11-29 14:28:24 -05:00
|
|
|
#include "utils/list.h"
|
2012-11-20 17:47:47 -05:00
|
|
|
#include "ap_config.h"
|
2013-12-15 03:47:40 -05:00
|
|
|
#include "drivers/driver.h"
|
2009-12-24 13:41:30 -05:00
|
|
|
|
2008-02-27 20:34:43 -05:00
|
|
|
struct wpa_ctrl_dst;
|
|
|
|
struct radius_server_data;
|
2009-01-29 11:47:02 -05:00
|
|
|
struct upnp_wps_device_sm;
|
2009-12-24 09:15:22 -05:00
|
|
|
struct hostapd_data;
|
2009-12-24 13:41:30 -05:00
|
|
|
struct sta_info;
|
2009-12-24 17:35:10 -05:00
|
|
|
struct ieee80211_ht_capabilities;
|
2008-02-27 20:34:43 -05:00
|
|
|
struct full_dynamic_vlan;
|
2010-10-14 13:57:00 -04:00
|
|
|
enum wps_event;
|
|
|
|
union wps_event_data;
|
2014-09-01 00:23:21 -04:00
|
|
|
#ifdef CONFIG_MESH
|
|
|
|
struct mesh_conf;
|
|
|
|
#endif /* CONFIG_MESH */
|
2008-02-27 20:34:43 -05:00
|
|
|
|
2012-08-25 05:43:27 -04:00
|
|
|
struct hostapd_iface;
|
|
|
|
|
2012-02-16 12:46:27 -05:00
|
|
|
struct hapd_interfaces {
|
2012-08-25 05:43:27 -04:00
|
|
|
int (*reload_config)(struct hostapd_iface *iface);
|
|
|
|
struct hostapd_config * (*config_read_cb)(const char *config_fname);
|
|
|
|
int (*ctrl_iface_init)(struct hostapd_data *hapd);
|
|
|
|
void (*ctrl_iface_deinit)(struct hostapd_data *hapd);
|
|
|
|
int (*for_each_interface)(struct hapd_interfaces *interfaces,
|
|
|
|
int (*cb)(struct hostapd_iface *iface,
|
|
|
|
void *ctx), void *ctx);
|
2011-12-16 13:42:40 -05:00
|
|
|
int (*driver_init)(struct hostapd_iface *iface);
|
2012-08-25 05:43:27 -04:00
|
|
|
|
2012-02-16 12:46:27 -05:00
|
|
|
size_t count;
|
2011-12-20 10:10:47 -05:00
|
|
|
int global_ctrl_sock;
|
2016-03-04 04:20:22 -05:00
|
|
|
struct dl_list global_ctrl_dst;
|
2011-12-20 10:10:47 -05:00
|
|
|
char *global_iface_path;
|
|
|
|
char *global_iface_name;
|
2013-11-20 16:12:03 -05:00
|
|
|
#ifndef CONFIG_NATIVE_WINDOWS
|
2013-03-29 11:09:31 -04:00
|
|
|
gid_t ctrl_iface_group;
|
2013-11-20 16:12:03 -05:00
|
|
|
#endif /* CONFIG_NATIVE_WINDOWS */
|
2012-02-16 12:46:27 -05:00
|
|
|
struct hostapd_iface **iface;
|
2013-11-05 06:39:21 -05:00
|
|
|
|
|
|
|
size_t terminate_on_error;
|
Fix removal of tagged interface and bridge when multiple BSS share them
Currently, if multiple bss share are bridge and tagged vlan interface,
only the first instance of struct hostapd_vlan for this vlanid will have
the DVLAN_CLEAN_VLAN flag added. Thus, when this instance is removed,
the tagged vlan interface will be removed from bridge, thought other bss
might still need it. Similarily, the bridge will be left over, as the
does not have zero ports when the first instance of a struct
hostapd_vlan is freed.
This patch fixes this by having a global (per process) reference counter
for dynamic tagged vlan and dynamically created bridge interfaces, so
they are only removed after all local users are freed. (struct
hapd_interfaces *)->vlan_priv is used to hold src/ap/vlan_init.c global
per-process data like drv_priv does; right now this is only used for the
interface reference counting, but could get extended when needed. Then
possibly some vlan_global_init / vlan_global_deinit should be added, but
this is not required right now.
Additionally, vlan->configured is checked to avoid reference counter
decreasing before vlan_newlink increased them.
In order to avoid race conditions, vlan_dellink is called explicitly
after hostapd_vlan_if_remove. Otherwise there would be a short timeframe
between hostapd_vlan_if_remove and vlan_dellink during which the struct
hostapd_vlan still exists, so ap_sta_bind_vlan would try to attach
stations to it.
Signed-off-by: Michael Braun <michael-dev@fami-braun.de>
2015-04-27 03:08:03 -04:00
|
|
|
#ifndef CONFIG_NO_VLAN
|
|
|
|
struct dynamic_iface *vlan_priv;
|
|
|
|
#endif /* CONFIG_NO_VLAN */
|
2012-02-16 12:46:27 -05:00
|
|
|
};
|
|
|
|
|
2013-07-18 03:17:06 -04:00
|
|
|
enum hostapd_chan_status {
|
|
|
|
HOSTAPD_CHAN_VALID = 0, /* channel is ready */
|
|
|
|
HOSTAPD_CHAN_INVALID = 1, /* no usable channel found */
|
|
|
|
HOSTAPD_CHAN_ACS = 2, /* ACS work being performed */
|
|
|
|
};
|
2012-02-16 12:46:27 -05:00
|
|
|
|
2009-06-12 11:13:40 -04:00
|
|
|
struct hostapd_probereq_cb {
|
2011-07-15 13:25:53 -04:00
|
|
|
int (*cb)(void *ctx, const u8 *sa, const u8 *da, const u8 *bssid,
|
2012-04-01 11:48:12 -04:00
|
|
|
const u8 *ie, size_t ie_len, int ssi_signal);
|
2009-06-12 11:13:40 -04:00
|
|
|
void *ctx;
|
|
|
|
};
|
|
|
|
|
2009-12-09 14:57:50 -05:00
|
|
|
#define HOSTAPD_RATE_BASIC 0x00000001
|
|
|
|
|
|
|
|
struct hostapd_rate_data {
|
|
|
|
int rate; /* rate in 100 kbps */
|
|
|
|
int flags; /* HOSTAPD_RATE_ flags */
|
|
|
|
};
|
|
|
|
|
2010-01-03 05:37:02 -05:00
|
|
|
struct hostapd_frame_info {
|
|
|
|
u32 channel;
|
|
|
|
u32 datarate;
|
2012-04-01 11:48:12 -04:00
|
|
|
int ssi_signal; /* dBm */
|
2010-01-03 05:37:02 -05:00
|
|
|
};
|
|
|
|
|
2013-08-23 09:38:16 -04:00
|
|
|
enum wps_status {
|
|
|
|
WPS_STATUS_SUCCESS = 1,
|
|
|
|
WPS_STATUS_FAILURE
|
|
|
|
};
|
|
|
|
|
2013-08-23 09:51:27 -04:00
|
|
|
enum pbc_status {
|
|
|
|
WPS_PBC_STATUS_DISABLE,
|
|
|
|
WPS_PBC_STATUS_ACTIVE,
|
|
|
|
WPS_PBC_STATUS_TIMEOUT,
|
|
|
|
WPS_PBC_STATUS_OVERLAP
|
|
|
|
};
|
|
|
|
|
2013-08-23 09:38:16 -04:00
|
|
|
struct wps_stat {
|
|
|
|
enum wps_status status;
|
|
|
|
enum wps_error_indication failure_reason;
|
2013-08-23 09:51:27 -04:00
|
|
|
enum pbc_status pbc_status;
|
2013-08-23 09:01:55 -04:00
|
|
|
u8 peer_addr[ETH_ALEN];
|
2013-08-23 09:38:16 -04:00
|
|
|
};
|
|
|
|
|
2009-12-09 14:57:50 -05:00
|
|
|
|
2008-02-27 20:34:43 -05:00
|
|
|
/**
|
|
|
|
* struct hostapd_data - hostapd per-BSS data structure
|
|
|
|
*/
|
|
|
|
struct hostapd_data {
|
|
|
|
struct hostapd_iface *iface;
|
|
|
|
struct hostapd_config *iconf;
|
|
|
|
struct hostapd_bss_config *conf;
|
2013-11-05 18:38:17 -05:00
|
|
|
int interface_added; /* virtual interface added for this BSS */
|
2013-11-06 06:39:41 -05:00
|
|
|
unsigned int started:1;
|
2015-02-10 11:13:04 -05:00
|
|
|
unsigned int disabled:1;
|
|
|
|
unsigned int reenable_beacon:1;
|
2008-02-27 20:34:43 -05:00
|
|
|
|
|
|
|
u8 own_addr[ETH_ALEN];
|
|
|
|
|
|
|
|
int num_sta; /* number of entries in sta_list */
|
|
|
|
struct sta_info *sta_list; /* STA info list head */
|
2009-03-25 09:54:25 -04:00
|
|
|
#define STA_HASH_SIZE 256
|
|
|
|
#define STA_HASH(sta) (sta[5])
|
2008-02-27 20:34:43 -05:00
|
|
|
struct sta_info *sta_hash[STA_HASH_SIZE];
|
|
|
|
|
2009-03-25 09:54:25 -04:00
|
|
|
/*
|
|
|
|
* Bitfield for indicating which AIDs are allocated. Only AID values
|
|
|
|
* 1-2007 are used and as such, the bit at index 0 corresponds to AID
|
|
|
|
* 1.
|
2008-02-27 20:34:43 -05:00
|
|
|
*/
|
2009-03-25 09:54:25 -04:00
|
|
|
#define AID_WORDS ((2008 + 31) / 32)
|
|
|
|
u32 sta_aid[AID_WORDS];
|
2008-02-27 20:34:43 -05:00
|
|
|
|
2009-04-09 06:40:12 -04:00
|
|
|
const struct wpa_driver_ops *driver;
|
2008-02-27 20:34:43 -05:00
|
|
|
void *drv_priv;
|
|
|
|
|
2009-12-24 16:42:13 -05:00
|
|
|
void (*new_assoc_sta_cb)(struct hostapd_data *hapd,
|
|
|
|
struct sta_info *sta, int reassoc);
|
|
|
|
|
2009-09-29 14:25:14 -04:00
|
|
|
void *msg_ctx; /* ctx for wpa_msg() calls */
|
2011-07-21 18:19:46 -04:00
|
|
|
void *msg_ctx_parent; /* parent interface ctx for wpa_msg() calls */
|
2009-09-29 14:25:14 -04:00
|
|
|
|
2008-02-27 20:34:43 -05:00
|
|
|
struct radius_client_data *radius;
|
2016-01-25 05:43:33 -05:00
|
|
|
u64 acct_session_id;
|
2012-05-06 15:02:42 -04:00
|
|
|
struct radius_das_data *radius_das;
|
2008-02-27 20:34:43 -05:00
|
|
|
|
|
|
|
struct iapp_data *iapp;
|
|
|
|
|
|
|
|
struct hostapd_cached_radius_acl *acl_cache;
|
|
|
|
struct hostapd_acl_query_data *acl_queries;
|
|
|
|
|
|
|
|
struct wpa_authenticator *wpa_auth;
|
|
|
|
struct eapol_authenticator *eapol_auth;
|
|
|
|
|
|
|
|
struct rsn_preauth_interface *preauth_iface;
|
2013-12-16 15:08:24 -05:00
|
|
|
struct os_reltime michael_mic_failure;
|
2008-02-27 20:34:43 -05:00
|
|
|
int michael_mic_failures;
|
|
|
|
int tkip_countermeasures;
|
|
|
|
|
|
|
|
int ctrl_sock;
|
2016-03-04 04:20:22 -05:00
|
|
|
struct dl_list ctrl_dst;
|
2008-02-27 20:34:43 -05:00
|
|
|
|
|
|
|
void *ssl_ctx;
|
|
|
|
void *eap_sim_db_priv;
|
|
|
|
struct radius_server_data *radius_srv;
|
2014-11-29 14:28:24 -05:00
|
|
|
struct dl_list erp_keys; /* struct eap_server_erp_key */
|
2008-02-27 20:34:43 -05:00
|
|
|
|
|
|
|
int parameter_set_count;
|
|
|
|
|
2011-10-17 17:24:16 -04:00
|
|
|
/* Time Advertisement */
|
|
|
|
u8 time_update_counter;
|
|
|
|
struct wpabuf *time_adv;
|
|
|
|
|
2008-02-27 20:34:43 -05:00
|
|
|
#ifdef CONFIG_FULL_DYNAMIC_VLAN
|
|
|
|
struct full_dynamic_vlan *full_dynamic_vlan;
|
|
|
|
#endif /* CONFIG_FULL_DYNAMIC_VLAN */
|
|
|
|
|
|
|
|
struct l2_packet_data *l2;
|
2008-11-23 12:34:26 -05:00
|
|
|
struct wps_context *wps;
|
|
|
|
|
2011-08-09 07:40:06 -04:00
|
|
|
int beacon_set_done;
|
2009-12-24 12:46:06 -05:00
|
|
|
struct wpabuf *wps_beacon_ie;
|
|
|
|
struct wpabuf *wps_probe_resp_ie;
|
2010-04-12 08:15:17 -04:00
|
|
|
#ifdef CONFIG_WPS
|
2009-01-23 14:57:43 -05:00
|
|
|
unsigned int ap_pin_failures;
|
2012-01-30 10:31:06 -05:00
|
|
|
unsigned int ap_pin_failures_consecutive;
|
2009-01-29 11:47:02 -05:00
|
|
|
struct upnp_wps_device_sm *wps_upnp;
|
2010-08-24 08:24:05 -04:00
|
|
|
unsigned int ap_pin_lockout_time;
|
2013-08-23 09:38:16 -04:00
|
|
|
|
|
|
|
struct wps_stat wps_stats;
|
2008-11-23 12:34:26 -05:00
|
|
|
#endif /* CONFIG_WPS */
|
2009-06-12 11:13:40 -04:00
|
|
|
|
|
|
|
struct hostapd_probereq_cb *probereq_cb;
|
|
|
|
size_t num_probereq_cb;
|
2010-04-11 13:21:08 -04:00
|
|
|
|
2010-04-11 13:33:33 -04:00
|
|
|
void (*public_action_cb)(void *ctx, const u8 *buf, size_t len,
|
|
|
|
int freq);
|
|
|
|
void *public_action_cb_ctx;
|
2013-02-04 08:38:35 -05:00
|
|
|
void (*public_action_cb2)(void *ctx, const u8 *buf, size_t len,
|
|
|
|
int freq);
|
|
|
|
void *public_action_cb2_ctx;
|
2010-04-11 13:33:33 -04:00
|
|
|
|
2010-07-18 17:30:25 -04:00
|
|
|
int (*vendor_action_cb)(void *ctx, const u8 *buf, size_t len,
|
|
|
|
int freq);
|
|
|
|
void *vendor_action_cb_ctx;
|
|
|
|
|
2010-04-11 13:21:08 -04:00
|
|
|
void (*wps_reg_success_cb)(void *ctx, const u8 *mac_addr,
|
|
|
|
const u8 *uuid_e);
|
|
|
|
void *wps_reg_success_cb_ctx;
|
2010-07-18 17:30:25 -04:00
|
|
|
|
2010-10-14 13:57:00 -04:00
|
|
|
void (*wps_event_cb)(void *ctx, enum wps_event event,
|
|
|
|
union wps_event_data *data);
|
|
|
|
void *wps_event_cb_ctx;
|
|
|
|
|
2011-02-02 09:56:59 -05:00
|
|
|
void (*sta_authorized_cb)(void *ctx, const u8 *mac_addr,
|
2011-12-22 15:47:41 -05:00
|
|
|
int authorized, const u8 *p2p_dev_addr);
|
2011-02-02 09:56:59 -05:00
|
|
|
void *sta_authorized_cb_ctx;
|
|
|
|
|
2011-03-19 07:11:15 -04:00
|
|
|
void (*setup_complete_cb)(void *ctx);
|
|
|
|
void *setup_complete_cb_ctx;
|
|
|
|
|
2013-09-01 06:40:33 -04:00
|
|
|
void (*new_psk_cb)(void *ctx, const u8 *mac_addr,
|
|
|
|
const u8 *p2p_dev_addr, const u8 *psk,
|
|
|
|
size_t psk_len);
|
|
|
|
void *new_psk_cb_ctx;
|
|
|
|
|
2014-06-27 08:19:27 -04:00
|
|
|
/* channel switch parameters */
|
|
|
|
struct hostapd_freq_params cs_freq_params;
|
|
|
|
u8 cs_count;
|
|
|
|
int cs_block_tx;
|
|
|
|
unsigned int cs_c_off_beacon;
|
|
|
|
unsigned int cs_c_off_proberesp;
|
|
|
|
int csa_in_progress;
|
2015-09-08 05:46:15 -04:00
|
|
|
unsigned int cs_c_off_ecsa_beacon;
|
|
|
|
unsigned int cs_c_off_ecsa_proberesp;
|
2014-06-27 08:19:27 -04:00
|
|
|
|
2014-10-15 19:36:04 -04:00
|
|
|
/* BSS Load */
|
|
|
|
unsigned int bss_load_update_timeout;
|
|
|
|
|
2010-07-18 17:30:25 -04:00
|
|
|
#ifdef CONFIG_P2P
|
2010-07-18 17:30:25 -04:00
|
|
|
struct p2p_data *p2p;
|
|
|
|
struct p2p_group *p2p_group;
|
2010-07-18 17:30:25 -04:00
|
|
|
struct wpabuf *p2p_beacon_ie;
|
|
|
|
struct wpabuf *p2p_probe_resp_ie;
|
2010-07-08 20:14:24 -04:00
|
|
|
|
|
|
|
/* Number of non-P2P association stations */
|
|
|
|
int num_sta_no_p2p;
|
|
|
|
|
|
|
|
/* Periodic NoA (used only when no non-P2P clients in the group) */
|
|
|
|
int noa_enabled;
|
|
|
|
int noa_start;
|
|
|
|
int noa_duration;
|
2010-07-18 17:30:25 -04:00
|
|
|
#endif /* CONFIG_P2P */
|
2012-02-26 15:34:19 -05:00
|
|
|
#ifdef CONFIG_INTERWORKING
|
|
|
|
size_t gas_frag_limit;
|
|
|
|
#endif /* CONFIG_INTERWORKING */
|
AP: Add support for Proxy ARP, DHCP snooping mechanism
Proxy ARP allows the AP devices to keep track of the hardware address to
IP address mapping of the STA devices within the BSS. When a request for
such information is made (i.e., ARP request, Neighbor Solicitation), the
AP will respond on behalf of the STA device within the BSS. Such
requests could originate from a device within the BSS or also from the
bridge. In the process of the AP replying to the request (i.e., ARP
reply, Neighbor Advertisement), the AP will drop the original request
frame. The relevant STA will not even know that such information was
ever requested.
This feature is a requirement for Hotspot 2.0, and is defined in IEEE
Std 802.11-2012, 10.23.13. While the Proxy ARP support code mainly
resides in the kernel bridge code, in order to optimize the performance
and simplify kernel implementation, the DHCP snooping code was added to
the hostapd.
Signed-off-by: Kyeyoon Park <kyeyoonp@qca.qualcomm.com>
2014-09-26 01:32:55 -04:00
|
|
|
#ifdef CONFIG_PROXYARP
|
|
|
|
struct l2_packet_data *sock_dhcp;
|
2014-11-01 02:33:41 -04:00
|
|
|
struct l2_packet_data *sock_ndisc;
|
AP: Add support for Proxy ARP, DHCP snooping mechanism
Proxy ARP allows the AP devices to keep track of the hardware address to
IP address mapping of the STA devices within the BSS. When a request for
such information is made (i.e., ARP request, Neighbor Solicitation), the
AP will respond on behalf of the STA device within the BSS. Such
requests could originate from a device within the BSS or also from the
bridge. In the process of the AP replying to the request (i.e., ARP
reply, Neighbor Advertisement), the AP will drop the original request
frame. The relevant STA will not even know that such information was
ever requested.
This feature is a requirement for Hotspot 2.0, and is defined in IEEE
Std 802.11-2012, 10.23.13. While the Proxy ARP support code mainly
resides in the kernel bridge code, in order to optimize the performance
and simplify kernel implementation, the DHCP snooping code was added to
the hostapd.
Signed-off-by: Kyeyoon Park <kyeyoonp@qca.qualcomm.com>
2014-09-26 01:32:55 -04:00
|
|
|
#endif /* CONFIG_PROXYARP */
|
2014-03-11 00:07:01 -04:00
|
|
|
#ifdef CONFIG_MESH
|
|
|
|
int num_plinks;
|
|
|
|
int max_plinks;
|
2016-01-30 21:45:30 -05:00
|
|
|
void (*mesh_sta_free_cb)(struct hostapd_data *hapd,
|
|
|
|
struct sta_info *sta);
|
2014-12-23 06:44:38 -05:00
|
|
|
struct wpabuf *mesh_pending_auth;
|
|
|
|
struct os_reltime mesh_pending_auth_time;
|
2016-03-09 04:16:14 -05:00
|
|
|
u8 mesh_required_peer[ETH_ALEN];
|
2014-03-11 00:07:01 -04:00
|
|
|
#endif /* CONFIG_MESH */
|
2012-11-20 17:47:47 -05:00
|
|
|
|
|
|
|
#ifdef CONFIG_SQLITE
|
|
|
|
struct hostapd_eap_user tmp_eap_user;
|
|
|
|
#endif /* CONFIG_SQLITE */
|
2012-12-31 09:58:36 -05:00
|
|
|
|
|
|
|
#ifdef CONFIG_SAE
|
|
|
|
/** Key used for generating SAE anti-clogging tokens */
|
|
|
|
u8 sae_token_key[8];
|
2013-11-25 15:56:07 -05:00
|
|
|
struct os_reltime last_sae_token_key_update;
|
2015-07-08 09:41:36 -04:00
|
|
|
int dot11RSNASAERetransPeriod; /* msec */
|
2012-12-31 09:58:36 -05:00
|
|
|
#endif /* CONFIG_SAE */
|
2013-12-26 01:35:22 -05:00
|
|
|
|
|
|
|
#ifdef CONFIG_TESTING_OPTIONS
|
2014-10-10 11:01:15 -04:00
|
|
|
unsigned int ext_mgmt_frame_handling:1;
|
|
|
|
unsigned int ext_eapol_frame_io:1;
|
2014-10-19 13:51:45 -04:00
|
|
|
|
|
|
|
struct l2_packet_data *l2_test;
|
2013-12-26 01:35:22 -05:00
|
|
|
#endif /* CONFIG_TESTING_OPTIONS */
|
2016-02-15 09:53:52 -05:00
|
|
|
|
|
|
|
#ifdef CONFIG_MBO
|
|
|
|
unsigned int mbo_assoc_disallow;
|
|
|
|
#endif /* CONFIG_MBO */
|
2008-02-27 20:34:43 -05:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2015-09-05 10:11:11 -04:00
|
|
|
struct hostapd_sta_info {
|
|
|
|
struct dl_list list;
|
|
|
|
u8 addr[ETH_ALEN];
|
|
|
|
struct os_reltime last_seen;
|
|
|
|
};
|
|
|
|
|
2008-02-27 20:34:43 -05:00
|
|
|
/**
|
|
|
|
* struct hostapd_iface - hostapd per-interface data structure
|
|
|
|
*/
|
|
|
|
struct hostapd_iface {
|
2009-12-19 12:07:31 -05:00
|
|
|
struct hapd_interfaces *interfaces;
|
2009-03-27 11:13:54 -04:00
|
|
|
void *owner;
|
2008-02-27 20:34:43 -05:00
|
|
|
char *config_fname;
|
|
|
|
struct hostapd_config *conf;
|
2013-10-17 10:41:26 -04:00
|
|
|
char phy[16]; /* Name of the PHY (radio) */
|
2008-02-27 20:34:43 -05:00
|
|
|
|
2013-11-03 10:25:05 -05:00
|
|
|
enum hostapd_iface_state {
|
|
|
|
HAPD_IFACE_UNINITIALIZED,
|
|
|
|
HAPD_IFACE_DISABLED,
|
|
|
|
HAPD_IFACE_COUNTRY_UPDATE,
|
|
|
|
HAPD_IFACE_ACS,
|
|
|
|
HAPD_IFACE_HT_SCAN,
|
|
|
|
HAPD_IFACE_DFS,
|
|
|
|
HAPD_IFACE_ENABLED
|
|
|
|
} state;
|
|
|
|
|
2014-09-01 00:23:21 -04:00
|
|
|
#ifdef CONFIG_MESH
|
|
|
|
struct mesh_conf *mconf;
|
|
|
|
#endif /* CONFIG_MESH */
|
|
|
|
|
2008-02-27 20:34:43 -05:00
|
|
|
size_t num_bss;
|
|
|
|
struct hostapd_data **bss;
|
|
|
|
|
2013-11-03 09:33:11 -05:00
|
|
|
unsigned int wait_channel_update:1;
|
2013-11-03 11:48:03 -05:00
|
|
|
unsigned int cac_started:1;
|
2015-01-21 08:30:48 -05:00
|
|
|
#ifdef CONFIG_FST
|
|
|
|
struct fst_iface *fst;
|
2015-08-03 10:37:05 -04:00
|
|
|
const struct wpabuf *fst_ies;
|
2015-01-21 08:30:48 -05:00
|
|
|
#endif /* CONFIG_FST */
|
2013-11-03 09:33:11 -05:00
|
|
|
|
2014-03-05 07:55:29 -05:00
|
|
|
/*
|
|
|
|
* When set, indicates that the driver will handle the AP
|
|
|
|
* teardown: delete global keys, station keys, and stations.
|
|
|
|
*/
|
|
|
|
unsigned int driver_ap_teardown:1;
|
|
|
|
|
2015-09-22 13:43:12 -04:00
|
|
|
/*
|
|
|
|
* When set, indicates that this interface is part of list of
|
|
|
|
* interfaces that need to be started together (synchronously).
|
|
|
|
*/
|
|
|
|
unsigned int need_to_start_in_sync:1;
|
|
|
|
|
|
|
|
/* Ready to start but waiting for other interfaces to become ready. */
|
|
|
|
unsigned int ready_to_start_in_sync:1;
|
|
|
|
|
2008-02-27 20:34:43 -05:00
|
|
|
int num_ap; /* number of entries in ap_list */
|
|
|
|
struct ap_info *ap_list; /* AP info list head */
|
|
|
|
struct ap_info *ap_hash[STA_HASH_SIZE];
|
|
|
|
|
2014-11-02 04:46:35 -05:00
|
|
|
u64 drv_flags;
|
2011-12-10 10:17:43 -05:00
|
|
|
|
2014-10-19 23:21:39 -04:00
|
|
|
/* SMPS modes supported by the driver (WPA_DRIVER_SMPS_MODE_*) */
|
|
|
|
unsigned int smps_modes;
|
|
|
|
|
2011-12-10 10:17:43 -05:00
|
|
|
/*
|
|
|
|
* A bitmap of supported protocols for probe response offload. See
|
|
|
|
* struct wpa_driver_capa in driver.h
|
|
|
|
*/
|
|
|
|
unsigned int probe_resp_offloads;
|
|
|
|
|
2013-03-31 14:51:44 -04:00
|
|
|
/* extended capabilities supported by the driver */
|
|
|
|
const u8 *extended_capa, *extended_capa_mask;
|
|
|
|
unsigned int extended_capa_len;
|
|
|
|
|
2013-05-24 06:37:22 -04:00
|
|
|
unsigned int drv_max_acl_mac_addrs;
|
|
|
|
|
2008-02-27 20:34:43 -05:00
|
|
|
struct hostapd_hw_modes *hw_features;
|
|
|
|
int num_hw_features;
|
|
|
|
struct hostapd_hw_modes *current_mode;
|
|
|
|
/* Rates that are currently used (i.e., filtered copy of
|
|
|
|
* current_mode->channels */
|
|
|
|
int num_rates;
|
|
|
|
struct hostapd_rate_data *current_rates;
|
2011-12-03 05:16:03 -05:00
|
|
|
int *basic_rates;
|
2010-04-11 13:33:33 -04:00
|
|
|
int freq;
|
2008-02-27 20:34:43 -05:00
|
|
|
|
|
|
|
u16 hw_flags;
|
|
|
|
|
|
|
|
/* Number of associated Non-ERP stations (i.e., stations using 802.11b
|
|
|
|
* in 802.11g BSS) */
|
|
|
|
int num_sta_non_erp;
|
|
|
|
|
|
|
|
/* Number of associated stations that do not support Short Slot Time */
|
|
|
|
int num_sta_no_short_slot_time;
|
|
|
|
|
|
|
|
/* Number of associated stations that do not support Short Preamble */
|
|
|
|
int num_sta_no_short_preamble;
|
|
|
|
|
|
|
|
int olbc; /* Overlapping Legacy BSS Condition */
|
|
|
|
|
2008-08-21 11:18:38 -04:00
|
|
|
/* Number of HT associated stations that do not support greenfield */
|
|
|
|
int num_sta_ht_no_gf;
|
|
|
|
|
|
|
|
/* Number of associated non-HT stations */
|
|
|
|
int num_sta_no_ht;
|
|
|
|
|
|
|
|
/* Number of HT associated stations 20 MHz */
|
|
|
|
int num_sta_ht_20mhz;
|
|
|
|
|
2014-04-14 13:40:56 -04:00
|
|
|
/* Number of HT40 intolerant stations */
|
|
|
|
int num_sta_ht40_intolerant;
|
|
|
|
|
2008-08-21 11:18:38 -04:00
|
|
|
/* Overlapping BSS information */
|
|
|
|
int olbc_ht;
|
|
|
|
|
2008-08-22 13:55:52 -04:00
|
|
|
u16 ht_op_mode;
|
2013-07-24 02:59:13 -04:00
|
|
|
|
|
|
|
/* surveying helpers */
|
|
|
|
|
|
|
|
/* number of channels surveyed */
|
|
|
|
unsigned int chans_surveyed;
|
|
|
|
|
|
|
|
/* lowest observed noise floor in dBm */
|
|
|
|
s8 lowest_nf;
|
|
|
|
|
2014-10-15 19:36:04 -04:00
|
|
|
/* channel utilization calculation */
|
|
|
|
u64 last_channel_time;
|
|
|
|
u64 last_channel_time_busy;
|
|
|
|
u8 channel_utilization;
|
|
|
|
|
2015-09-08 05:46:15 -04:00
|
|
|
/* eCSA IE will be added only if operating class is specified */
|
|
|
|
u8 cs_oper_class;
|
|
|
|
|
2014-03-05 03:23:42 -05:00
|
|
|
unsigned int dfs_cac_ms;
|
|
|
|
struct os_reltime dfs_cac_start;
|
|
|
|
|
2014-04-14 13:40:56 -04:00
|
|
|
/* Latched with the actual secondary channel information and will be
|
|
|
|
* used while juggling between HT20 and HT40 modes. */
|
|
|
|
int secondary_ch;
|
|
|
|
|
2013-08-31 04:49:51 -04:00
|
|
|
#ifdef CONFIG_ACS
|
|
|
|
unsigned int acs_num_completed_scans;
|
|
|
|
#endif /* CONFIG_ACS */
|
|
|
|
|
2009-04-16 09:22:40 -04:00
|
|
|
void (*scan_cb)(struct hostapd_iface *iface);
|
2014-04-16 11:45:53 -04:00
|
|
|
int num_ht40_scan_tries;
|
2015-09-05 10:11:11 -04:00
|
|
|
|
|
|
|
struct dl_list sta_seen; /* struct hostapd_sta_info */
|
|
|
|
unsigned int num_sta_seen;
|
2008-02-27 20:34:43 -05:00
|
|
|
};
|
|
|
|
|
2009-12-25 07:20:35 -05:00
|
|
|
/* hostapd.c */
|
2012-02-16 12:46:27 -05:00
|
|
|
int hostapd_for_each_interface(struct hapd_interfaces *interfaces,
|
|
|
|
int (*cb)(struct hostapd_iface *iface,
|
|
|
|
void *ctx), void *ctx);
|
2008-11-23 12:34:26 -05:00
|
|
|
int hostapd_reload_config(struct hostapd_iface *iface);
|
2009-03-26 13:23:41 -04:00
|
|
|
struct hostapd_data *
|
|
|
|
hostapd_alloc_bss_data(struct hostapd_iface *hapd_iface,
|
|
|
|
struct hostapd_config *conf,
|
|
|
|
struct hostapd_bss_config *bss);
|
2009-03-26 13:06:02 -04:00
|
|
|
int hostapd_setup_interface(struct hostapd_iface *iface);
|
2009-04-16 09:22:40 -04:00
|
|
|
int hostapd_setup_interface_complete(struct hostapd_iface *iface, int err);
|
2009-03-26 13:06:02 -04:00
|
|
|
void hostapd_interface_deinit(struct hostapd_iface *iface);
|
2009-12-27 14:31:13 -05:00
|
|
|
void hostapd_interface_free(struct hostapd_iface *iface);
|
2013-10-29 10:27:30 -04:00
|
|
|
struct hostapd_iface * hostapd_init(struct hapd_interfaces *interfaces,
|
|
|
|
const char *config_file);
|
2013-10-29 10:29:49 -04:00
|
|
|
struct hostapd_iface *
|
|
|
|
hostapd_interface_init_bss(struct hapd_interfaces *interfaces, const char *phy,
|
|
|
|
const char *config_fname, int debug);
|
2009-12-25 07:20:35 -05:00
|
|
|
void hostapd_new_assoc_sta(struct hostapd_data *hapd, struct sta_info *sta,
|
|
|
|
int reassoc);
|
2011-12-16 13:42:40 -05:00
|
|
|
void hostapd_interface_deinit_free(struct hostapd_iface *iface);
|
|
|
|
int hostapd_enable_iface(struct hostapd_iface *hapd_iface);
|
|
|
|
int hostapd_reload_iface(struct hostapd_iface *hapd_iface);
|
|
|
|
int hostapd_disable_iface(struct hostapd_iface *hapd_iface);
|
2012-08-25 04:37:12 -04:00
|
|
|
int hostapd_add_iface(struct hapd_interfaces *ifaces, char *buf);
|
|
|
|
int hostapd_remove_iface(struct hapd_interfaces *ifaces, char *buf);
|
2013-11-13 07:00:27 -05:00
|
|
|
void hostapd_channel_list_updated(struct hostapd_iface *iface, int initiator);
|
2013-11-03 10:25:05 -05:00
|
|
|
void hostapd_set_state(struct hostapd_iface *iface, enum hostapd_iface_state s);
|
2013-11-03 11:13:14 -05:00
|
|
|
const char * hostapd_state_text(enum hostapd_iface_state s);
|
2015-09-08 05:46:18 -04:00
|
|
|
int hostapd_csa_in_progress(struct hostapd_iface *iface);
|
2013-11-14 05:28:31 -05:00
|
|
|
int hostapd_switch_channel(struct hostapd_data *hapd,
|
|
|
|
struct csa_settings *settings);
|
2014-06-27 08:19:30 -04:00
|
|
|
void
|
|
|
|
hostapd_switch_channel_fallback(struct hostapd_iface *iface,
|
|
|
|
const struct hostapd_freq_params *freq_params);
|
2013-11-14 05:28:31 -05:00
|
|
|
void hostapd_cleanup_cs_params(struct hostapd_data *hapd);
|
2015-07-20 06:33:30 -04:00
|
|
|
void hostapd_periodic_iface(struct hostapd_iface *iface);
|
2009-03-26 13:06:02 -04:00
|
|
|
|
2009-12-25 07:20:35 -05:00
|
|
|
/* utils.c */
|
2009-06-12 11:13:40 -04:00
|
|
|
int hostapd_register_probereq_cb(struct hostapd_data *hapd,
|
2009-12-28 06:14:58 -05:00
|
|
|
int (*cb)(void *ctx, const u8 *sa,
|
2011-07-15 13:25:53 -04:00
|
|
|
const u8 *da, const u8 *bssid,
|
2012-04-01 11:48:12 -04:00
|
|
|
const u8 *ie, size_t ie_len,
|
|
|
|
int ssi_signal),
|
2009-06-12 11:13:40 -04:00
|
|
|
void *ctx);
|
2009-12-25 07:06:26 -05:00
|
|
|
void hostapd_prune_associations(struct hostapd_data *hapd, const u8 *addr);
|
2009-06-12 11:13:40 -04:00
|
|
|
|
2010-01-03 11:22:22 -05:00
|
|
|
/* drv_callbacks.c (TODO: move to somewhere else?) */
|
|
|
|
int hostapd_notif_assoc(struct hostapd_data *hapd, const u8 *addr,
|
2010-10-25 06:50:34 -04:00
|
|
|
const u8 *ie, size_t ielen, int reassoc);
|
2010-01-03 11:22:22 -05:00
|
|
|
void hostapd_notif_disassoc(struct hostapd_data *hapd, const u8 *addr);
|
2010-12-28 10:15:01 -05:00
|
|
|
void hostapd_event_sta_low_ack(struct hostapd_data *hapd, const u8 *addr);
|
2013-02-07 08:24:53 -05:00
|
|
|
void hostapd_event_connect_failed_reason(struct hostapd_data *hapd,
|
|
|
|
const u8 *addr, int reason_code);
|
2011-07-15 13:25:53 -04:00
|
|
|
int hostapd_probe_req_rx(struct hostapd_data *hapd, const u8 *sa, const u8 *da,
|
2012-04-01 11:48:12 -04:00
|
|
|
const u8 *bssid, const u8 *ie, size_t ie_len,
|
|
|
|
int ssi_signal);
|
2012-06-25 07:45:14 -04:00
|
|
|
void hostapd_event_ch_switch(struct hostapd_data *hapd, int freq, int ht,
|
2013-11-25 14:16:12 -05:00
|
|
|
int offset, int width, int cf1, int cf2);
|
2015-11-27 06:40:36 -05:00
|
|
|
struct survey_results;
|
|
|
|
void hostapd_event_get_survey(struct hostapd_iface *iface,
|
|
|
|
struct survey_results *survey_results);
|
2015-11-27 06:40:37 -05:00
|
|
|
void hostapd_acs_channel_selected(struct hostapd_data *hapd,
|
|
|
|
struct acs_selected_channels *acs_res);
|
2010-01-03 11:22:22 -05:00
|
|
|
|
2012-11-20 17:47:47 -05:00
|
|
|
const struct hostapd_eap_user *
|
|
|
|
hostapd_get_eap_user(struct hostapd_data *hapd, const u8 *identity,
|
|
|
|
size_t identity_len, int phase2);
|
|
|
|
|
2015-01-21 08:30:48 -05:00
|
|
|
struct hostapd_data * hostapd_get_iface(struct hapd_interfaces *interfaces,
|
|
|
|
const char *ifname);
|
|
|
|
|
|
|
|
#ifdef CONFIG_FST
|
|
|
|
void fst_hostapd_fill_iface_obj(struct hostapd_data *hapd,
|
|
|
|
struct fst_wpa_obj *iface_obj);
|
|
|
|
#endif /* CONFIG_FST */
|
|
|
|
|
2008-02-27 20:34:43 -05:00
|
|
|
#endif /* HOSTAPD_H */
|