1 /* 2 * hostapd / Initialization and configuration 3 * Copyright (c) 2002-2009, Jouni Malinen <j@w1.fi> 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License version 2 as 7 * published by the Free Software Foundation. 8 * 9 * Alternatively, this software may be distributed under the terms of BSD 10 * license. 11 * 12 * See README and COPYING for more details. 13 */ 14 15 #ifndef HOSTAPD_H 16 #define HOSTAPD_H 17 18 #include "common/defs.h" 19 20 struct wpa_driver_ops; 21 struct wpa_ctrl_dst; 22 struct radius_server_data; 23 struct upnp_wps_device_sm; 24 struct hapd_interfaces; 25 struct hostapd_data; 26 struct sta_info; 27 struct hostap_sta_driver_data; 28 struct ieee80211_ht_capabilities; 29 struct full_dynamic_vlan; 30 31 struct hostapd_probereq_cb { 32 int (*cb)(void *ctx, const u8 *sa, const u8 *ie, size_t ie_len); 33 void *ctx; 34 }; 35 36 #define HOSTAPD_RATE_BASIC 0x00000001 37 38 struct hostapd_rate_data { 39 int rate; /* rate in 100 kbps */ 40 int flags; /* HOSTAPD_RATE_ flags */ 41 }; 42 43 struct hostapd_frame_info { 44 u32 channel; 45 u32 datarate; 46 u32 ssi_signal; 47 }; 48 49 50 struct hostapd_driver_ops { 51 int (*set_ap_wps_ie)(struct hostapd_data *hapd); 52 int (*send_mgmt_frame)(struct hostapd_data *hapd, const void *msg, 53 size_t len); 54 int (*send_eapol)(struct hostapd_data *hapd, const u8 *addr, 55 const u8 *data, size_t data_len, int encrypt); 56 int (*set_authorized)(struct hostapd_data *hapd, struct sta_info *sta, 57 int authorized); 58 int (*set_key)(const char *ifname, struct hostapd_data *hapd, 59 enum wpa_alg alg, const u8 *addr, int key_idx, 60 int set_tx, const u8 *seq, size_t seq_len, 61 const u8 *key, size_t key_len); 62 int (*read_sta_data)(struct hostapd_data *hapd, 63 struct hostap_sta_driver_data *data, 64 const u8 *addr); 65 int (*sta_clear_stats)(struct hostapd_data *hapd, const u8 *addr); 66 int (*set_sta_flags)(struct hostapd_data *hapd, struct sta_info *sta); 67 int (*set_drv_ieee8021x)(struct hostapd_data *hapd, const char *ifname, 68 int enabled); 69 int (*set_radius_acl_auth)(struct hostapd_data *hapd, 70 const u8 *mac, int accepted, 71 u32 session_timeout); 72 int (*set_radius_acl_expire)(struct hostapd_data *hapd, 73 const u8 *mac); 74 int (*set_bss_params)(struct hostapd_data *hapd, int use_protection); 75 int (*set_beacon)(struct hostapd_data *hapd, 76 const u8 *head, size_t head_len, 77 const u8 *tail, size_t tail_len, int dtim_period, 78 int beacon_int); 79 int (*vlan_if_add)(struct hostapd_data *hapd, const char *ifname); 80 int (*vlan_if_remove)(struct hostapd_data *hapd, const char *ifname); 81 int (*set_wds_sta)(struct hostapd_data *hapd, const u8 *addr, int aid, 82 int val); 83 int (*set_sta_vlan)(const char *ifname, struct hostapd_data *hapd, 84 const u8 *addr, int vlan_id); 85 int (*get_inact_sec)(struct hostapd_data *hapd, const u8 *addr); 86 int (*sta_deauth)(struct hostapd_data *hapd, const u8 *addr, 87 int reason); 88 int (*sta_disassoc)(struct hostapd_data *hapd, const u8 *addr, 89 int reason); 90 int (*sta_add)(struct hostapd_data *hapd, 91 const u8 *addr, u16 aid, u16 capability, 92 const u8 *supp_rates, size_t supp_rates_len, 93 u16 listen_interval, 94 const struct ieee80211_ht_capabilities *ht_capab); 95 int (*sta_remove)(struct hostapd_data *hapd, const u8 *addr); 96 int (*set_countermeasures)(struct hostapd_data *hapd, int enabled); 97 }; 98 99 /** 100 * struct hostapd_data - hostapd per-BSS data structure 101 */ 102 struct hostapd_data { 103 struct hostapd_iface *iface; 104 struct hostapd_config *iconf; 105 struct hostapd_bss_config *conf; 106 int interface_added; /* virtual interface added for this BSS */ 107 108 u8 own_addr[ETH_ALEN]; 109 110 int num_sta; /* number of entries in sta_list */ 111 struct sta_info *sta_list; /* STA info list head */ 112 #define STA_HASH_SIZE 256 113 #define STA_HASH(sta) (sta[5]) 114 struct sta_info *sta_hash[STA_HASH_SIZE]; 115 116 /* 117 * Bitfield for indicating which AIDs are allocated. Only AID values 118 * 1-2007 are used and as such, the bit at index 0 corresponds to AID 119 * 1. 120 */ 121 #define AID_WORDS ((2008 + 31) / 32) 122 u32 sta_aid[AID_WORDS]; 123 124 const struct wpa_driver_ops *driver; 125 void *drv_priv; 126 struct hostapd_driver_ops drv; 127 128 void (*new_assoc_sta_cb)(struct hostapd_data *hapd, 129 struct sta_info *sta, int reassoc); 130 131 void *msg_ctx; /* ctx for wpa_msg() calls */ 132 133 struct radius_client_data *radius; 134 u32 acct_session_id_hi, acct_session_id_lo; 135 136 struct iapp_data *iapp; 137 138 struct hostapd_cached_radius_acl *acl_cache; 139 struct hostapd_acl_query_data *acl_queries; 140 141 struct wpa_authenticator *wpa_auth; 142 struct eapol_authenticator *eapol_auth; 143 144 struct rsn_preauth_interface *preauth_iface; 145 time_t michael_mic_failure; 146 int michael_mic_failures; 147 int tkip_countermeasures; 148 149 int ctrl_sock; 150 struct wpa_ctrl_dst *ctrl_dst; 151 152 void *ssl_ctx; 153 void *eap_sim_db_priv; 154 struct radius_server_data *radius_srv; 155 156 int parameter_set_count; 157 158 #ifdef CONFIG_FULL_DYNAMIC_VLAN 159 struct full_dynamic_vlan *full_dynamic_vlan; 160 #endif /* CONFIG_FULL_DYNAMIC_VLAN */ 161 162 struct l2_packet_data *l2; 163 struct wps_context *wps; 164 165 struct wpabuf *wps_beacon_ie; 166 struct wpabuf *wps_probe_resp_ie; 167 #ifdef CONFIG_WPS 168 unsigned int ap_pin_failures; 169 struct upnp_wps_device_sm *wps_upnp; 170 unsigned int ap_pin_lockout_time; 171 #endif /* CONFIG_WPS */ 172 173 struct hostapd_probereq_cb *probereq_cb; 174 size_t num_probereq_cb; 175 176 void (*public_action_cb)(void *ctx, const u8 *buf, size_t len, 177 int freq); 178 void *public_action_cb_ctx; 179 180 void (*wps_reg_success_cb)(void *ctx, const u8 *mac_addr, 181 const u8 *uuid_e); 182 void *wps_reg_success_cb_ctx; 183 }; 184 185 186 /** 187 * struct hostapd_iface - hostapd per-interface data structure 188 */ 189 struct hostapd_iface { 190 struct hapd_interfaces *interfaces; 191 void *owner; 192 int (*reload_config)(struct hostapd_iface *iface); 193 struct hostapd_config * (*config_read_cb)(const char *config_fname); 194 char *config_fname; 195 struct hostapd_config *conf; 196 197 size_t num_bss; 198 struct hostapd_data **bss; 199 200 int num_ap; /* number of entries in ap_list */ 201 struct ap_info *ap_list; /* AP info list head */ 202 struct ap_info *ap_hash[STA_HASH_SIZE]; 203 struct ap_info *ap_iter_list; 204 205 struct hostapd_hw_modes *hw_features; 206 int num_hw_features; 207 struct hostapd_hw_modes *current_mode; 208 /* Rates that are currently used (i.e., filtered copy of 209 * current_mode->channels */ 210 int num_rates; 211 struct hostapd_rate_data *current_rates; 212 int freq; 213 214 u16 hw_flags; 215 216 /* Number of associated Non-ERP stations (i.e., stations using 802.11b 217 * in 802.11g BSS) */ 218 int num_sta_non_erp; 219 220 /* Number of associated stations that do not support Short Slot Time */ 221 int num_sta_no_short_slot_time; 222 223 /* Number of associated stations that do not support Short Preamble */ 224 int num_sta_no_short_preamble; 225 226 int olbc; /* Overlapping Legacy BSS Condition */ 227 228 /* Number of HT associated stations that do not support greenfield */ 229 int num_sta_ht_no_gf; 230 231 /* Number of associated non-HT stations */ 232 int num_sta_no_ht; 233 234 /* Number of HT associated stations 20 MHz */ 235 int num_sta_ht_20mhz; 236 237 /* Overlapping BSS information */ 238 int olbc_ht; 239 240 u16 ht_op_mode; 241 void (*scan_cb)(struct hostapd_iface *iface); 242 243 int (*ctrl_iface_init)(struct hostapd_data *hapd); 244 void (*ctrl_iface_deinit)(struct hostapd_data *hapd); 245 246 int (*for_each_interface)(struct hapd_interfaces *interfaces, 247 int (*cb)(struct hostapd_iface *iface, 248 void *ctx), void *ctx); 249 }; 250 251 /* hostapd.c */ 252 int hostapd_reload_config(struct hostapd_iface *iface); 253 struct hostapd_data * 254 hostapd_alloc_bss_data(struct hostapd_iface *hapd_iface, 255 struct hostapd_config *conf, 256 struct hostapd_bss_config *bss); 257 int hostapd_setup_interface(struct hostapd_iface *iface); 258 int hostapd_setup_interface_complete(struct hostapd_iface *iface, int err); 259 void hostapd_interface_deinit(struct hostapd_iface *iface); 260 void hostapd_interface_free(struct hostapd_iface *iface); 261 void hostapd_new_assoc_sta(struct hostapd_data *hapd, struct sta_info *sta, 262 int reassoc); 263 264 /* utils.c */ 265 int hostapd_register_probereq_cb(struct hostapd_data *hapd, 266 int (*cb)(void *ctx, const u8 *sa, 267 const u8 *ie, size_t ie_len), 268 void *ctx); 269 void hostapd_prune_associations(struct hostapd_data *hapd, const u8 *addr); 270 271 /* drv_callbacks.c (TODO: move to somewhere else?) */ 272 int hostapd_notif_assoc(struct hostapd_data *hapd, const u8 *addr, 273 const u8 *ie, size_t ielen); 274 void hostapd_notif_disassoc(struct hostapd_data *hapd, const u8 *addr); 275 276 #endif /* HOSTAPD_H */ 277