2 * hostapd / Initialization and configuration
3 * Copyright (c) 2002-2009, Jouni Malinen <j@w1.fi>
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.
9 * Alternatively, this software may be distributed under the terms of BSD
12 * See README and COPYING for more details.
15 #include "utils/includes.h"
17 #include "utils/common.h"
18 #include "utils/eloop.h"
19 #include "common/ieee802_11_defs.h"
20 #include "radius/radius_client.h"
21 #include "drivers/driver.h"
25 #include "accounting.h"
29 #include "ieee802_1x.h"
30 #include "ieee802_11_auth.h"
31 #include "vlan_init.h"
33 #include "wps_hostapd.h"
34 #include "hw_features.h"
35 #include "wpa_auth_glue.h"
36 #include "ap_drv_ops.h"
37 #include "ap_config.h"
40 static int hostapd_flush_old_stations(struct hostapd_data
*hapd
);
41 static int hostapd_setup_encryption(char *iface
, struct hostapd_data
*hapd
);
43 extern int wpa_debug_level
;
46 int hostapd_reload_config(struct hostapd_iface
*iface
)
48 struct hostapd_data
*hapd
= iface
->bss
[0];
49 struct hostapd_config
*newconf
, *oldconf
;
52 if (iface
->config_read_cb
== NULL
)
54 newconf
= iface
->config_read_cb(iface
->config_fname
);
59 * Deauthenticate all stations since the new configuration may not
60 * allow them to use the BSS anymore.
62 for (j
= 0; j
< iface
->num_bss
; j
++)
63 hostapd_flush_old_stations(iface
->bss
[j
]);
65 #ifndef CONFIG_NO_RADIUS
66 /* TODO: update dynamic data based on changed configuration
67 * items (e.g., open/close sockets, etc.) */
68 radius_client_flush(hapd
->radius
, 0);
69 #endif /* CONFIG_NO_RADIUS */
71 oldconf
= hapd
->iconf
;
72 hapd
->iconf
= newconf
;
73 hapd
->conf
= &newconf
->bss
[0];
74 iface
->conf
= newconf
;
76 if (hostapd_setup_wpa_psk(hapd
->conf
)) {
77 wpa_printf(MSG_ERROR
, "Failed to re-configure WPA PSK "
78 "after reloading configuration");
81 if (hapd
->conf
->wpa
&& hapd
->wpa_auth
== NULL
)
82 hostapd_setup_wpa(hapd
);
83 else if (hapd
->conf
->wpa
) {
86 hostapd_reconfig_wpa(hapd
);
87 wpa_ie
= wpa_auth_get_wpa_ie(hapd
->wpa_auth
, &wpa_ie_len
);
88 if (hostapd_set_generic_elem(hapd
, wpa_ie
, wpa_ie_len
))
89 wpa_printf(MSG_ERROR
, "Failed to configure WPA IE for "
90 "the kernel driver.");
91 } else if (hapd
->wpa_auth
) {
92 wpa_deinit(hapd
->wpa_auth
);
93 hapd
->wpa_auth
= NULL
;
94 hostapd_set_privacy(hapd
, 0);
95 hostapd_setup_encryption(hapd
->conf
->iface
, hapd
);
96 hostapd_set_generic_elem(hapd
, (u8
*) "", 0);
99 ieee802_11_set_beacon(hapd
);
101 if (hapd
->conf
->ssid
.ssid_set
&&
102 hostapd_set_ssid(hapd
, (u8
*) hapd
->conf
->ssid
.ssid
,
103 hapd
->conf
->ssid
.ssid_len
)) {
104 wpa_printf(MSG_ERROR
, "Could not set SSID for kernel driver");
105 /* try to continue */
108 if (hapd
->conf
->ieee802_1x
|| hapd
->conf
->wpa
)
109 hapd
->drv
.set_drv_ieee8021x(hapd
, hapd
->conf
->iface
, 1);
111 hapd
->drv
.set_drv_ieee8021x(hapd
, hapd
->conf
->iface
, 0);
113 hostapd_config_free(oldconf
);
115 wpa_printf(MSG_DEBUG
, "Reconfigured interface %s", hapd
->conf
->iface
);
121 static void hostapd_broadcast_key_clear_iface(struct hostapd_data
*hapd
,
126 for (i
= 0; i
< NUM_WEP_KEYS
; i
++) {
127 if (hapd
->drv
.set_key(ifname
, hapd
, WPA_ALG_NONE
, NULL
, i
,
128 i
== 0 ? 1 : 0, NULL
, 0, NULL
, 0)) {
129 wpa_printf(MSG_DEBUG
, "Failed to clear default "
130 "encryption keys (ifname=%s keyidx=%d)",
134 #ifdef CONFIG_IEEE80211W
135 if (hapd
->conf
->ieee80211w
) {
136 for (i
= NUM_WEP_KEYS
; i
< NUM_WEP_KEYS
+ 2; i
++) {
137 if (hapd
->drv
.set_key(ifname
, hapd
, WPA_ALG_NONE
, NULL
,
138 i
, i
== 0 ? 1 : 0, NULL
, 0,
140 wpa_printf(MSG_DEBUG
, "Failed to clear "
141 "default mgmt encryption keys "
142 "(ifname=%s keyidx=%d)", ifname
, i
);
146 #endif /* CONFIG_IEEE80211W */
150 static int hostapd_broadcast_wep_clear(struct hostapd_data
*hapd
)
152 hostapd_broadcast_key_clear_iface(hapd
, hapd
->conf
->iface
);
157 static int hostapd_broadcast_wep_set(struct hostapd_data
*hapd
)
160 struct hostapd_ssid
*ssid
= &hapd
->conf
->ssid
;
163 if (ssid
->wep
.default_len
&&
164 hapd
->drv
.set_key(hapd
->conf
->iface
,
165 hapd
, WPA_ALG_WEP
, NULL
, idx
,
166 idx
== ssid
->wep
.idx
,
167 NULL
, 0, ssid
->wep
.key
[idx
],
168 ssid
->wep
.len
[idx
])) {
169 wpa_printf(MSG_WARNING
, "Could not set WEP encryption.");
173 if (ssid
->dyn_vlan_keys
) {
175 for (i
= 0; i
<= ssid
->max_dyn_vlan_keys
; i
++) {
177 struct hostapd_wep_keys
*key
= ssid
->dyn_vlan_keys
[i
];
180 ifname
= hostapd_get_vlan_id_ifname(hapd
->conf
->vlan
,
186 if (hapd
->drv
.set_key(ifname
, hapd
, WPA_ALG_WEP
, NULL
,
187 idx
, idx
== key
->idx
, NULL
, 0,
188 key
->key
[idx
], key
->len
[idx
])) {
189 wpa_printf(MSG_WARNING
, "Could not set "
190 "dynamic VLAN WEP encryption.");
200 * hostapd_cleanup - Per-BSS cleanup (deinitialization)
201 * @hapd: Pointer to BSS data
203 * This function is used to free all per-BSS data structures and resources.
204 * This gets called in a loop for each BSS between calls to
205 * hostapd_cleanup_iface_pre() and hostapd_cleanup_iface() when an interface
206 * is deinitialized. Most of the modules that are initialized in
207 * hostapd_setup_bss() are deinitialized here.
209 static void hostapd_cleanup(struct hostapd_data
*hapd
)
211 if (hapd
->iface
->ctrl_iface_deinit
)
212 hapd
->iface
->ctrl_iface_deinit(hapd
);
214 iapp_deinit(hapd
->iapp
);
216 accounting_deinit(hapd
);
217 hostapd_deinit_wpa(hapd
);
219 hostapd_acl_deinit(hapd
);
220 #ifndef CONFIG_NO_RADIUS
221 radius_client_deinit(hapd
->radius
);
223 #endif /* CONFIG_NO_RADIUS */
225 hostapd_deinit_wps(hapd
);
227 authsrv_deinit(hapd
);
229 if (hapd
->interface_added
&&
230 hostapd_if_remove(hapd
, WPA_IF_AP_BSS
, hapd
->conf
->iface
)) {
231 wpa_printf(MSG_WARNING
, "Failed to remove BSS interface %s",
235 os_free(hapd
->probereq_cb
);
236 hapd
->probereq_cb
= NULL
;
241 * hostapd_cleanup_iface_pre - Preliminary per-interface cleanup
242 * @iface: Pointer to interface data
244 * This function is called before per-BSS data structures are deinitialized
245 * with hostapd_cleanup().
247 static void hostapd_cleanup_iface_pre(struct hostapd_iface
*iface
)
253 * hostapd_cleanup_iface - Complete per-interface cleanup
254 * @iface: Pointer to interface data
256 * This function is called after per-BSS data structures are deinitialized
257 * with hostapd_cleanup().
259 static void hostapd_cleanup_iface(struct hostapd_iface
*iface
)
261 hostapd_free_hw_features(iface
->hw_features
, iface
->num_hw_features
);
262 iface
->hw_features
= NULL
;
263 os_free(iface
->current_rates
);
264 iface
->current_rates
= NULL
;
265 ap_list_deinit(iface
);
266 hostapd_config_free(iface
->conf
);
269 os_free(iface
->config_fname
);
275 static int hostapd_setup_encryption(char *iface
, struct hostapd_data
*hapd
)
279 hostapd_broadcast_wep_set(hapd
);
281 if (hapd
->conf
->ssid
.wep
.default_len
) {
282 hostapd_set_privacy(hapd
, 1);
286 for (i
= 0; i
< 4; i
++) {
287 if (hapd
->conf
->ssid
.wep
.key
[i
] &&
288 hapd
->drv
.set_key(iface
, hapd
, WPA_ALG_WEP
, NULL
, i
,
289 i
== hapd
->conf
->ssid
.wep
.idx
, NULL
, 0,
290 hapd
->conf
->ssid
.wep
.key
[i
],
291 hapd
->conf
->ssid
.wep
.len
[i
])) {
292 wpa_printf(MSG_WARNING
, "Could not set WEP "
296 if (hapd
->conf
->ssid
.wep
.key
[i
] &&
297 i
== hapd
->conf
->ssid
.wep
.idx
)
298 hostapd_set_privacy(hapd
, 1);
305 static int hostapd_flush_old_stations(struct hostapd_data
*hapd
)
309 if (hostapd_drv_none(hapd
) || hapd
->drv_priv
== NULL
)
312 wpa_printf(MSG_DEBUG
, "Flushing old station entries");
313 if (hostapd_flush(hapd
)) {
314 wpa_printf(MSG_WARNING
, "Could not connect to kernel driver.");
317 wpa_printf(MSG_DEBUG
, "Deauthenticate all stations");
319 /* New Prism2.5/3 STA firmware versions seem to have issues with this
320 * broadcast deauth frame. This gets the firmware in odd state where
321 * nothing works correctly, so let's skip sending this for the hostap
323 if (hapd
->driver
&& os_strcmp(hapd
->driver
->name
, "hostap") != 0) {
325 os_memset(addr
, 0xff, ETH_ALEN
);
326 hapd
->drv
.sta_deauth(hapd
, addr
,
327 WLAN_REASON_PREV_AUTH_NOT_VALID
);
335 * hostapd_validate_bssid_configuration - Validate BSSID configuration
336 * @iface: Pointer to interface data
337 * Returns: 0 on success, -1 on failure
339 * This function is used to validate that the configured BSSIDs are valid.
341 static int hostapd_validate_bssid_configuration(struct hostapd_iface
*iface
)
343 u8 mask
[ETH_ALEN
] = { 0 };
344 struct hostapd_data
*hapd
= iface
->bss
[0];
345 unsigned int i
= iface
->conf
->num_bss
, bits
= 0, j
;
349 if (hostapd_drv_none(hapd
))
352 /* Generate BSSID mask that is large enough to cover the BSSIDs. */
354 /* Determine the bits necessary to cover the number of BSSIDs. */
355 for (i
--; i
; i
>>= 1)
358 /* Determine the bits necessary to any configured BSSIDs,
359 if they are higher than the number of BSSIDs. */
360 for (j
= 0; j
< iface
->conf
->num_bss
; j
++) {
361 if (hostapd_mac_comp_empty(iface
->conf
->bss
[j
].bssid
) == 0) {
367 for (i
= 0; i
< ETH_ALEN
; i
++) {
369 iface
->conf
->bss
[j
].bssid
[i
] ^
377 for (i
= 0; i
< ETH_ALEN
&& mask
[i
] == 0; i
++)
383 while (mask
[i
] != 0) {
393 wpa_printf(MSG_ERROR
, "Too many bits in the BSSID mask (%u)",
398 os_memset(mask
, 0xff, ETH_ALEN
);
400 for (i
= 5; i
> 5 - j
; i
--)
407 wpa_printf(MSG_DEBUG
, "BSS count %lu, BSSID mask " MACSTR
" (%d bits)",
408 (unsigned long) iface
->conf
->num_bss
, MAC2STR(mask
), bits
);
410 res
= hostapd_valid_bss_mask(hapd
, hapd
->own_addr
, mask
);
415 wpa_printf(MSG_ERROR
, "Driver did not accept BSSID mask "
416 MACSTR
" for start address " MACSTR
".",
417 MAC2STR(mask
), MAC2STR(hapd
->own_addr
));
424 for (i
= 0; i
< ETH_ALEN
; i
++) {
425 if ((hapd
->own_addr
[i
] & mask
[i
]) != hapd
->own_addr
[i
]) {
426 wpa_printf(MSG_ERROR
, "Invalid BSSID mask " MACSTR
427 " for start address " MACSTR
".",
428 MAC2STR(mask
), MAC2STR(hapd
->own_addr
));
429 wpa_printf(MSG_ERROR
, "Start address must be the "
430 "first address in the block (i.e., addr "
431 "AND mask == addr).");
440 static int mac_in_conf(struct hostapd_config
*conf
, const void *a
)
444 for (i
= 0; i
< conf
->num_bss
; i
++) {
445 if (hostapd_mac_comp(conf
->bss
[i
].bssid
, a
) == 0) {
457 * hostapd_setup_bss - Per-BSS setup (initialization)
458 * @hapd: Pointer to BSS data
459 * @first: Whether this BSS is the first BSS of an interface
461 * This function is used to initialize all per-BSS data structures and
462 * resources. This gets called in a loop for each BSS when an interface is
463 * initialized. Most of the modules that are initialized here will be
464 * deinitialized in hostapd_cleanup().
466 static int hostapd_setup_bss(struct hostapd_data
*hapd
, int first
)
468 struct hostapd_bss_config
*conf
= hapd
->conf
;
469 u8 ssid
[HOSTAPD_MAX_SSID_LEN
+ 1];
470 int ssid_len
, set_ssid
;
473 if (hostapd_mac_comp_empty(hapd
->conf
->bssid
) == 0) {
474 /* Allocate the next available BSSID. */
476 inc_byte_array(hapd
->own_addr
, ETH_ALEN
);
477 } while (mac_in_conf(hapd
->iconf
, hapd
->own_addr
));
479 /* Allocate the configured BSSID. */
480 os_memcpy(hapd
->own_addr
, hapd
->conf
->bssid
, ETH_ALEN
);
482 if (hostapd_mac_comp(hapd
->own_addr
,
483 hapd
->iface
->bss
[0]->own_addr
) ==
485 wpa_printf(MSG_ERROR
, "BSS '%s' may not have "
486 "BSSID set to the MAC address of "
487 "the radio", hapd
->conf
->iface
);
492 hapd
->interface_added
= 1;
493 if (hostapd_if_add(hapd
->iface
->bss
[0], WPA_IF_AP_BSS
,
494 hapd
->conf
->iface
, hapd
->own_addr
, hapd
,
496 wpa_printf(MSG_ERROR
, "Failed to add BSS (BSSID="
497 MACSTR
")", MAC2STR(hapd
->own_addr
));
502 hostapd_flush_old_stations(hapd
);
503 hostapd_set_privacy(hapd
, 0);
505 hostapd_broadcast_wep_clear(hapd
);
506 if (hostapd_setup_encryption(hapd
->conf
->iface
, hapd
))
510 * Fetch the SSID from the system and use it or,
511 * if one was specified in the config file, verify they
514 ssid_len
= hostapd_get_ssid(hapd
, ssid
, sizeof(ssid
));
516 wpa_printf(MSG_ERROR
, "Could not read SSID from system");
519 if (conf
->ssid
.ssid_set
) {
521 * If SSID is specified in the config file and it differs
522 * from what is being used then force installation of the
525 set_ssid
= (conf
->ssid
.ssid_len
!= (size_t) ssid_len
||
526 os_memcmp(conf
->ssid
.ssid
, ssid
, ssid_len
) != 0);
529 * No SSID in the config file; just use the one we got
533 conf
->ssid
.ssid_len
= ssid_len
;
534 os_memcpy(conf
->ssid
.ssid
, ssid
, conf
->ssid
.ssid_len
);
535 conf
->ssid
.ssid
[conf
->ssid
.ssid_len
] = '\0';
538 if (!hostapd_drv_none(hapd
)) {
539 wpa_printf(MSG_ERROR
, "Using interface %s with hwaddr " MACSTR
541 hapd
->conf
->iface
, MAC2STR(hapd
->own_addr
),
542 hapd
->conf
->ssid
.ssid
);
545 if (hostapd_setup_wpa_psk(conf
)) {
546 wpa_printf(MSG_ERROR
, "WPA-PSK setup failed.");
550 /* Set SSID for the kernel driver (to be used in beacon and probe
551 * response frames) */
552 if (set_ssid
&& hostapd_set_ssid(hapd
, (u8
*) conf
->ssid
.ssid
,
553 conf
->ssid
.ssid_len
)) {
554 wpa_printf(MSG_ERROR
, "Could not set SSID for kernel driver");
558 if (wpa_debug_level
== MSG_MSGDUMP
)
559 conf
->radius
->msg_dumps
= 1;
560 #ifndef CONFIG_NO_RADIUS
561 hapd
->radius
= radius_client_init(hapd
, conf
->radius
);
562 if (hapd
->radius
== NULL
) {
563 wpa_printf(MSG_ERROR
, "RADIUS client initialization failed.");
566 #endif /* CONFIG_NO_RADIUS */
568 if (hostapd_acl_init(hapd
)) {
569 wpa_printf(MSG_ERROR
, "ACL initialization failed.");
572 if (hostapd_init_wps(hapd
, conf
))
575 if (authsrv_init(hapd
) < 0)
578 if (ieee802_1x_init(hapd
)) {
579 wpa_printf(MSG_ERROR
, "IEEE 802.1X initialization failed.");
583 if (hapd
->conf
->wpa
&& hostapd_setup_wpa(hapd
))
586 if (accounting_init(hapd
)) {
587 wpa_printf(MSG_ERROR
, "Accounting initialization failed.");
591 if (hapd
->conf
->ieee802_11f
&&
592 (hapd
->iapp
= iapp_init(hapd
, hapd
->conf
->iapp_iface
)) == NULL
) {
593 wpa_printf(MSG_ERROR
, "IEEE 802.11F (IAPP) initialization "
598 if (hapd
->iface
->ctrl_iface_init
&&
599 hapd
->iface
->ctrl_iface_init(hapd
)) {
600 wpa_printf(MSG_ERROR
, "Failed to setup control interface");
604 if (!hostapd_drv_none(hapd
) && vlan_init(hapd
)) {
605 wpa_printf(MSG_ERROR
, "VLAN initialization failed.");
609 ieee802_11_set_beacon(hapd
);
615 static void hostapd_tx_queue_params(struct hostapd_iface
*iface
)
617 struct hostapd_data
*hapd
= iface
->bss
[0];
619 struct hostapd_tx_queue_params
*p
;
621 for (i
= 0; i
< NUM_TX_QUEUES
; i
++) {
622 p
= &iface
->conf
->tx_queue
[i
];
627 if (hostapd_set_tx_queue_params(hapd
, i
, p
->aifs
, p
->cwmin
,
628 p
->cwmax
, p
->burst
)) {
629 wpa_printf(MSG_DEBUG
, "Failed to set TX queue "
630 "parameters for queue %d.", i
);
631 /* Continue anyway */
637 static int setup_interface(struct hostapd_iface
*iface
)
639 struct hostapd_data
*hapd
= iface
->bss
[0];
644 * Make sure that all BSSes get configured with a pointer to the same
647 for (i
= 1; i
< iface
->num_bss
; i
++) {
648 iface
->bss
[i
]->driver
= hapd
->driver
;
649 iface
->bss
[i
]->drv_priv
= hapd
->drv_priv
;
652 if (hostapd_validate_bssid_configuration(iface
))
655 if (hapd
->iconf
->country
[0] && hapd
->iconf
->country
[1]) {
656 os_memcpy(country
, hapd
->iconf
->country
, 3);
658 if (hostapd_set_country(hapd
, country
) < 0) {
659 wpa_printf(MSG_ERROR
, "Failed to set country code");
664 if (hostapd_get_hw_features(iface
)) {
665 /* Not all drivers support this yet, so continue without hw
668 int ret
= hostapd_select_hw_mode(iface
);
670 wpa_printf(MSG_ERROR
, "Could not select hw_mode and "
671 "channel. (%d)", ret
);
674 ret
= hostapd_check_ht_capab(iface
);
678 wpa_printf(MSG_DEBUG
, "Interface initialization will "
679 "be completed in a callback");
683 return hostapd_setup_interface_complete(iface
, 0);
687 int hostapd_setup_interface_complete(struct hostapd_iface
*iface
, int err
)
689 struct hostapd_data
*hapd
= iface
->bss
[0];
695 wpa_printf(MSG_ERROR
, "Interface initialization failed");
700 wpa_printf(MSG_DEBUG
, "Completing interface initialization");
701 if (hapd
->iconf
->channel
) {
702 freq
= hostapd_hw_get_freq(hapd
, hapd
->iconf
->channel
);
703 wpa_printf(MSG_DEBUG
, "Mode: %s Channel: %d "
705 hostapd_hw_mode_txt(hapd
->iconf
->hw_mode
),
706 hapd
->iconf
->channel
, freq
);
708 if (hostapd_set_freq(hapd
, hapd
->iconf
->hw_mode
, freq
,
709 hapd
->iconf
->channel
,
710 hapd
->iconf
->ieee80211n
,
711 hapd
->iconf
->secondary_channel
)) {
712 wpa_printf(MSG_ERROR
, "Could not set channel for "
718 if (hapd
->iconf
->rts_threshold
> -1 &&
719 hostapd_set_rts(hapd
, hapd
->iconf
->rts_threshold
)) {
720 wpa_printf(MSG_ERROR
, "Could not set RTS threshold for "
725 if (hapd
->iconf
->fragm_threshold
> -1 &&
726 hostapd_set_frag(hapd
, hapd
->iconf
->fragm_threshold
)) {
727 wpa_printf(MSG_ERROR
, "Could not set fragmentation threshold "
728 "for kernel driver");
732 prev_addr
= hapd
->own_addr
;
734 for (j
= 0; j
< iface
->num_bss
; j
++) {
735 hapd
= iface
->bss
[j
];
737 os_memcpy(hapd
->own_addr
, prev_addr
, ETH_ALEN
);
738 if (hostapd_setup_bss(hapd
, j
== 0))
740 if (hostapd_mac_comp_empty(hapd
->conf
->bssid
) == 0)
741 prev_addr
= hapd
->own_addr
;
744 hostapd_tx_queue_params(iface
);
748 if (hostapd_driver_commit(hapd
) < 0) {
749 wpa_printf(MSG_ERROR
, "%s: Failed to commit driver "
750 "configuration", __func__
);
754 wpa_printf(MSG_DEBUG
, "%s: Setup of interface done.",
755 iface
->bss
[0]->conf
->iface
);
762 * hostapd_setup_interface - Setup of an interface
763 * @iface: Pointer to interface data.
764 * Returns: 0 on success, -1 on failure
766 * Initializes the driver interface, validates the configuration,
767 * and sets driver parameters based on the configuration.
768 * Flushes old stations, sets the channel, encryption,
769 * beacons, and WDS links based on the configuration.
771 int hostapd_setup_interface(struct hostapd_iface
*iface
)
775 ret
= setup_interface(iface
);
777 wpa_printf(MSG_ERROR
, "%s: Unable to setup interface.",
778 iface
->bss
[0]->conf
->iface
);
787 * hostapd_alloc_bss_data - Allocate and initialize per-BSS data
788 * @hapd_iface: Pointer to interface data
789 * @conf: Pointer to per-interface configuration
790 * @bss: Pointer to per-BSS configuration for this BSS
791 * Returns: Pointer to allocated BSS data
793 * This function is used to allocate per-BSS data structure. This data will be
794 * freed after hostapd_cleanup() is called for it during interface
797 struct hostapd_data
*
798 hostapd_alloc_bss_data(struct hostapd_iface
*hapd_iface
,
799 struct hostapd_config
*conf
,
800 struct hostapd_bss_config
*bss
)
802 struct hostapd_data
*hapd
;
804 hapd
= os_zalloc(sizeof(*hapd
));
808 hostapd_set_driver_ops(&hapd
->drv
);
809 hapd
->new_assoc_sta_cb
= hostapd_new_assoc_sta
;
812 hapd
->iface
= hapd_iface
;
813 hapd
->driver
= hapd
->iconf
->driver
;
819 void hostapd_interface_deinit(struct hostapd_iface
*iface
)
826 hostapd_cleanup_iface_pre(iface
);
827 for (j
= 0; j
< iface
->num_bss
; j
++) {
828 struct hostapd_data
*hapd
= iface
->bss
[j
];
829 hostapd_free_stas(hapd
);
830 hostapd_flush_old_stations(hapd
);
831 hostapd_cleanup(hapd
);
836 void hostapd_interface_free(struct hostapd_iface
*iface
)
839 for (j
= 0; j
< iface
->num_bss
; j
++)
840 os_free(iface
->bss
[j
]);
841 hostapd_cleanup_iface(iface
);
846 * hostapd_new_assoc_sta - Notify that a new station associated with the AP
847 * @hapd: Pointer to BSS data
848 * @sta: Pointer to the associated STA data
849 * @reassoc: 1 to indicate this was a re-association; 0 = first association
851 * This function will be called whenever a station associates with the AP. It
852 * can be called from ieee802_11.c for drivers that export MLME to hostapd and
853 * from drv_callbacks.c based on driver events for drivers that take care of
854 * management frames (IEEE 802.11 authentication and association) internally.
856 void hostapd_new_assoc_sta(struct hostapd_data
*hapd
, struct sta_info
*sta
,
859 if (hapd
->tkip_countermeasures
) {
860 hapd
->drv
.sta_deauth(hapd
, sta
->addr
,
861 WLAN_REASON_MICHAEL_MIC_FAILURE
);
865 hostapd_prune_associations(hapd
, sta
->addr
);
867 /* IEEE 802.11F (IAPP) */
868 if (hapd
->conf
->ieee802_11f
)
869 iapp_new_station(hapd
->iapp
, sta
);
871 /* Start accounting here, if IEEE 802.1X and WPA are not used.
872 * IEEE 802.1X/WPA code will start accounting after the station has
873 * been authorized. */
874 if (!hapd
->conf
->ieee802_1x
&& !hapd
->conf
->wpa
)
875 accounting_sta_start(hapd
, sta
);
877 /* Start IEEE 802.1X authentication process for new stations */
878 ieee802_1x_new_station(hapd
, sta
);
880 if (sta
->auth_alg
!= WLAN_AUTH_FT
&&
881 !(sta
->flags
& (WLAN_STA_WPS
| WLAN_STA_MAYBE_WPS
)))
882 wpa_auth_sm_event(sta
->wpa_sm
, WPA_REAUTH
);
884 wpa_auth_sta_associated(hapd
->wpa_auth
, sta
->wpa_sm
);