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
)
84 hostapd_reconfig_wpa(hapd
);
85 else if (hapd
->wpa_auth
) {
86 wpa_deinit(hapd
->wpa_auth
);
87 hapd
->wpa_auth
= NULL
;
88 hostapd_set_privacy(hapd
, 0);
89 hostapd_setup_encryption(hapd
->conf
->iface
, hapd
);
92 ieee802_11_set_beacon(hapd
);
94 if (hapd
->conf
->ssid
.ssid_set
&&
95 hostapd_set_ssid(hapd
, (u8
*) hapd
->conf
->ssid
.ssid
,
96 hapd
->conf
->ssid
.ssid_len
)) {
97 wpa_printf(MSG_ERROR
, "Could not set SSID for kernel driver");
101 if (hapd
->conf
->ieee802_1x
|| hapd
->conf
->wpa
)
102 hapd
->drv
.set_drv_ieee8021x(hapd
, hapd
->conf
->iface
, 1);
104 hapd
->drv
.set_drv_ieee8021x(hapd
, hapd
->conf
->iface
, 0);
106 hostapd_config_free(oldconf
);
108 wpa_printf(MSG_DEBUG
, "Reconfigured interface %s", hapd
->conf
->iface
);
114 static void hostapd_broadcast_key_clear_iface(struct hostapd_data
*hapd
,
119 for (i
= 0; i
< NUM_WEP_KEYS
; i
++) {
120 if (hapd
->drv
.set_key(ifname
, hapd
, WPA_ALG_NONE
, NULL
, i
,
121 i
== 0 ? 1 : 0, NULL
, 0, NULL
, 0)) {
122 wpa_printf(MSG_DEBUG
, "Failed to clear default "
123 "encryption keys (ifname=%s keyidx=%d)",
127 #ifdef CONFIG_IEEE80211W
128 if (hapd
->conf
->ieee80211w
) {
129 for (i
= NUM_WEP_KEYS
; i
< NUM_WEP_KEYS
+ 2; i
++) {
130 if (hapd
->drv
.set_key(ifname
, hapd
, WPA_ALG_NONE
, NULL
,
131 i
, i
== 0 ? 1 : 0, NULL
, 0,
133 wpa_printf(MSG_DEBUG
, "Failed to clear "
134 "default mgmt encryption keys "
135 "(ifname=%s keyidx=%d)", ifname
, i
);
139 #endif /* CONFIG_IEEE80211W */
143 static int hostapd_broadcast_wep_clear(struct hostapd_data
*hapd
)
145 hostapd_broadcast_key_clear_iface(hapd
, hapd
->conf
->iface
);
150 static int hostapd_broadcast_wep_set(struct hostapd_data
*hapd
)
153 struct hostapd_ssid
*ssid
= &hapd
->conf
->ssid
;
156 if (ssid
->wep
.default_len
&&
157 hapd
->drv
.set_key(hapd
->conf
->iface
,
158 hapd
, WPA_ALG_WEP
, NULL
, idx
,
159 idx
== ssid
->wep
.idx
,
160 NULL
, 0, ssid
->wep
.key
[idx
],
161 ssid
->wep
.len
[idx
])) {
162 wpa_printf(MSG_WARNING
, "Could not set WEP encryption.");
166 if (ssid
->dyn_vlan_keys
) {
168 for (i
= 0; i
<= ssid
->max_dyn_vlan_keys
; i
++) {
170 struct hostapd_wep_keys
*key
= ssid
->dyn_vlan_keys
[i
];
173 ifname
= hostapd_get_vlan_id_ifname(hapd
->conf
->vlan
,
179 if (hapd
->drv
.set_key(ifname
, hapd
, WPA_ALG_WEP
, NULL
,
180 idx
, idx
== key
->idx
, NULL
, 0,
181 key
->key
[idx
], key
->len
[idx
])) {
182 wpa_printf(MSG_WARNING
, "Could not set "
183 "dynamic VLAN WEP encryption.");
193 * hostapd_cleanup - Per-BSS cleanup (deinitialization)
194 * @hapd: Pointer to BSS data
196 * This function is used to free all per-BSS data structures and resources.
197 * This gets called in a loop for each BSS between calls to
198 * hostapd_cleanup_iface_pre() and hostapd_cleanup_iface() when an interface
199 * is deinitialized. Most of the modules that are initialized in
200 * hostapd_setup_bss() are deinitialized here.
202 static void hostapd_cleanup(struct hostapd_data
*hapd
)
204 if (hapd
->iface
->ctrl_iface_deinit
)
205 hapd
->iface
->ctrl_iface_deinit(hapd
);
207 iapp_deinit(hapd
->iapp
);
209 accounting_deinit(hapd
);
210 hostapd_deinit_wpa(hapd
);
212 hostapd_acl_deinit(hapd
);
213 #ifndef CONFIG_NO_RADIUS
214 radius_client_deinit(hapd
->radius
);
216 #endif /* CONFIG_NO_RADIUS */
218 hostapd_deinit_wps(hapd
);
220 authsrv_deinit(hapd
);
222 if (hapd
->interface_added
&&
223 hostapd_if_remove(hapd
, WPA_IF_AP_BSS
, hapd
->conf
->iface
)) {
224 wpa_printf(MSG_WARNING
, "Failed to remove BSS interface %s",
228 os_free(hapd
->probereq_cb
);
229 hapd
->probereq_cb
= NULL
;
234 * hostapd_cleanup_iface_pre - Preliminary per-interface cleanup
235 * @iface: Pointer to interface data
237 * This function is called before per-BSS data structures are deinitialized
238 * with hostapd_cleanup().
240 static void hostapd_cleanup_iface_pre(struct hostapd_iface
*iface
)
246 * hostapd_cleanup_iface - Complete per-interface cleanup
247 * @iface: Pointer to interface data
249 * This function is called after per-BSS data structures are deinitialized
250 * with hostapd_cleanup().
252 static void hostapd_cleanup_iface(struct hostapd_iface
*iface
)
254 hostapd_free_hw_features(iface
->hw_features
, iface
->num_hw_features
);
255 iface
->hw_features
= NULL
;
256 os_free(iface
->current_rates
);
257 iface
->current_rates
= NULL
;
258 ap_list_deinit(iface
);
259 hostapd_config_free(iface
->conf
);
262 os_free(iface
->config_fname
);
268 static int hostapd_setup_encryption(char *iface
, struct hostapd_data
*hapd
)
272 hostapd_broadcast_wep_set(hapd
);
274 if (hapd
->conf
->ssid
.wep
.default_len
) {
275 hostapd_set_privacy(hapd
, 1);
279 for (i
= 0; i
< 4; i
++) {
280 if (hapd
->conf
->ssid
.wep
.key
[i
] &&
281 hapd
->drv
.set_key(iface
, hapd
, WPA_ALG_WEP
, NULL
, i
,
282 i
== hapd
->conf
->ssid
.wep
.idx
, NULL
, 0,
283 hapd
->conf
->ssid
.wep
.key
[i
],
284 hapd
->conf
->ssid
.wep
.len
[i
])) {
285 wpa_printf(MSG_WARNING
, "Could not set WEP "
289 if (hapd
->conf
->ssid
.wep
.key
[i
] &&
290 i
== hapd
->conf
->ssid
.wep
.idx
)
291 hostapd_set_privacy(hapd
, 1);
298 static int hostapd_flush_old_stations(struct hostapd_data
*hapd
)
302 if (hostapd_drv_none(hapd
))
305 wpa_printf(MSG_DEBUG
, "Flushing old station entries");
306 if (hostapd_flush(hapd
)) {
307 wpa_printf(MSG_WARNING
, "Could not connect to kernel driver.");
310 wpa_printf(MSG_DEBUG
, "Deauthenticate all stations");
312 /* New Prism2.5/3 STA firmware versions seem to have issues with this
313 * broadcast deauth frame. This gets the firmware in odd state where
314 * nothing works correctly, so let's skip sending this for the hostap
316 if (hapd
->driver
&& os_strcmp(hapd
->driver
->name
, "hostap") != 0) {
318 os_memset(addr
, 0xff, ETH_ALEN
);
319 hapd
->drv
.sta_deauth(hapd
, addr
,
320 WLAN_REASON_PREV_AUTH_NOT_VALID
);
328 * hostapd_validate_bssid_configuration - Validate BSSID configuration
329 * @iface: Pointer to interface data
330 * Returns: 0 on success, -1 on failure
332 * This function is used to validate that the configured BSSIDs are valid.
334 static int hostapd_validate_bssid_configuration(struct hostapd_iface
*iface
)
336 u8 mask
[ETH_ALEN
] = { 0 };
337 struct hostapd_data
*hapd
= iface
->bss
[0];
338 unsigned int i
= iface
->conf
->num_bss
, bits
= 0, j
;
342 if (hostapd_drv_none(hapd
))
345 /* Generate BSSID mask that is large enough to cover the BSSIDs. */
347 /* Determine the bits necessary to cover the number of BSSIDs. */
348 for (i
--; i
; i
>>= 1)
351 /* Determine the bits necessary to any configured BSSIDs,
352 if they are higher than the number of BSSIDs. */
353 for (j
= 0; j
< iface
->conf
->num_bss
; j
++) {
354 if (hostapd_mac_comp_empty(iface
->conf
->bss
[j
].bssid
) == 0) {
360 for (i
= 0; i
< ETH_ALEN
; i
++) {
362 iface
->conf
->bss
[j
].bssid
[i
] ^
370 for (i
= 0; i
< ETH_ALEN
&& mask
[i
] == 0; i
++)
376 while (mask
[i
] != 0) {
386 wpa_printf(MSG_ERROR
, "Too many bits in the BSSID mask (%u)",
391 os_memset(mask
, 0xff, ETH_ALEN
);
393 for (i
= 5; i
> 5 - j
; i
--)
400 wpa_printf(MSG_DEBUG
, "BSS count %lu, BSSID mask " MACSTR
" (%d bits)",
401 (unsigned long) iface
->conf
->num_bss
, MAC2STR(mask
), bits
);
403 res
= hostapd_valid_bss_mask(hapd
, hapd
->own_addr
, mask
);
408 wpa_printf(MSG_ERROR
, "Driver did not accept BSSID mask "
409 MACSTR
" for start address " MACSTR
".",
410 MAC2STR(mask
), MAC2STR(hapd
->own_addr
));
417 for (i
= 0; i
< ETH_ALEN
; i
++) {
418 if ((hapd
->own_addr
[i
] & mask
[i
]) != hapd
->own_addr
[i
]) {
419 wpa_printf(MSG_ERROR
, "Invalid BSSID mask " MACSTR
420 " for start address " MACSTR
".",
421 MAC2STR(mask
), MAC2STR(hapd
->own_addr
));
422 wpa_printf(MSG_ERROR
, "Start address must be the "
423 "first address in the block (i.e., addr "
424 "AND mask == addr).");
433 static int mac_in_conf(struct hostapd_config
*conf
, const void *a
)
437 for (i
= 0; i
< conf
->num_bss
; i
++) {
438 if (hostapd_mac_comp(conf
->bss
[i
].bssid
, a
) == 0) {
450 * hostapd_setup_bss - Per-BSS setup (initialization)
451 * @hapd: Pointer to BSS data
452 * @first: Whether this BSS is the first BSS of an interface
454 * This function is used to initialize all per-BSS data structures and
455 * resources. This gets called in a loop for each BSS when an interface is
456 * initialized. Most of the modules that are initialized here will be
457 * deinitialized in hostapd_cleanup().
459 static int hostapd_setup_bss(struct hostapd_data
*hapd
, int first
)
461 struct hostapd_bss_config
*conf
= hapd
->conf
;
462 u8 ssid
[HOSTAPD_MAX_SSID_LEN
+ 1];
463 int ssid_len
, set_ssid
;
466 if (hostapd_mac_comp_empty(hapd
->conf
->bssid
) == 0) {
467 /* Allocate the next available BSSID. */
469 inc_byte_array(hapd
->own_addr
, ETH_ALEN
);
470 } while (mac_in_conf(hapd
->iconf
, hapd
->own_addr
));
472 /* Allocate the configured BSSID. */
473 os_memcpy(hapd
->own_addr
, hapd
->conf
->bssid
, ETH_ALEN
);
475 if (hostapd_mac_comp(hapd
->own_addr
,
476 hapd
->iface
->bss
[0]->own_addr
) ==
478 wpa_printf(MSG_ERROR
, "BSS '%s' may not have "
479 "BSSID set to the MAC address of "
480 "the radio", hapd
->conf
->iface
);
485 hapd
->interface_added
= 1;
486 if (hostapd_if_add(hapd
->iface
->bss
[0], WPA_IF_AP_BSS
,
487 hapd
->conf
->iface
, hapd
->own_addr
, hapd
)) {
488 wpa_printf(MSG_ERROR
, "Failed to add BSS (BSSID="
489 MACSTR
")", MAC2STR(hapd
->own_addr
));
494 hostapd_flush_old_stations(hapd
);
495 hostapd_set_privacy(hapd
, 0);
497 hostapd_broadcast_wep_clear(hapd
);
498 if (hostapd_setup_encryption(hapd
->conf
->iface
, hapd
))
502 * Fetch the SSID from the system and use it or,
503 * if one was specified in the config file, verify they
506 ssid_len
= hostapd_get_ssid(hapd
, ssid
, sizeof(ssid
));
508 wpa_printf(MSG_ERROR
, "Could not read SSID from system");
511 if (conf
->ssid
.ssid_set
) {
513 * If SSID is specified in the config file and it differs
514 * from what is being used then force installation of the
517 set_ssid
= (conf
->ssid
.ssid_len
!= (size_t) ssid_len
||
518 os_memcmp(conf
->ssid
.ssid
, ssid
, ssid_len
) != 0);
521 * No SSID in the config file; just use the one we got
525 conf
->ssid
.ssid_len
= ssid_len
;
526 os_memcpy(conf
->ssid
.ssid
, ssid
, conf
->ssid
.ssid_len
);
527 conf
->ssid
.ssid
[conf
->ssid
.ssid_len
] = '\0';
530 if (!hostapd_drv_none(hapd
)) {
531 wpa_printf(MSG_ERROR
, "Using interface %s with hwaddr " MACSTR
533 hapd
->conf
->iface
, MAC2STR(hapd
->own_addr
),
534 hapd
->conf
->ssid
.ssid
);
537 if (hostapd_setup_wpa_psk(conf
)) {
538 wpa_printf(MSG_ERROR
, "WPA-PSK setup failed.");
542 /* Set SSID for the kernel driver (to be used in beacon and probe
543 * response frames) */
544 if (set_ssid
&& hostapd_set_ssid(hapd
, (u8
*) conf
->ssid
.ssid
,
545 conf
->ssid
.ssid_len
)) {
546 wpa_printf(MSG_ERROR
, "Could not set SSID for kernel driver");
550 if (wpa_debug_level
== MSG_MSGDUMP
)
551 conf
->radius
->msg_dumps
= 1;
552 #ifndef CONFIG_NO_RADIUS
553 hapd
->radius
= radius_client_init(hapd
, conf
->radius
);
554 if (hapd
->radius
== NULL
) {
555 wpa_printf(MSG_ERROR
, "RADIUS client initialization failed.");
558 #endif /* CONFIG_NO_RADIUS */
560 if (hostapd_acl_init(hapd
)) {
561 wpa_printf(MSG_ERROR
, "ACL initialization failed.");
564 if (hostapd_init_wps(hapd
, conf
))
567 if (ieee802_1x_init(hapd
)) {
568 wpa_printf(MSG_ERROR
, "IEEE 802.1X initialization failed.");
572 if (hapd
->conf
->wpa
&& hostapd_setup_wpa(hapd
))
575 if (accounting_init(hapd
)) {
576 wpa_printf(MSG_ERROR
, "Accounting initialization failed.");
580 if (hapd
->conf
->ieee802_11f
&&
581 (hapd
->iapp
= iapp_init(hapd
, hapd
->conf
->iapp_iface
)) == NULL
) {
582 wpa_printf(MSG_ERROR
, "IEEE 802.11F (IAPP) initialization "
587 if (hapd
->iface
->ctrl_iface_init
&&
588 hapd
->iface
->ctrl_iface_init(hapd
)) {
589 wpa_printf(MSG_ERROR
, "Failed to setup control interface");
593 if (!hostapd_drv_none(hapd
) && vlan_init(hapd
)) {
594 wpa_printf(MSG_ERROR
, "VLAN initialization failed.");
598 ieee802_11_set_beacon(hapd
);
600 if (authsrv_init(hapd
) < 0)
607 static void hostapd_tx_queue_params(struct hostapd_iface
*iface
)
609 struct hostapd_data
*hapd
= iface
->bss
[0];
611 struct hostapd_tx_queue_params
*p
;
613 for (i
= 0; i
< NUM_TX_QUEUES
; i
++) {
614 p
= &iface
->conf
->tx_queue
[i
];
619 if (hostapd_set_tx_queue_params(hapd
, i
, p
->aifs
, p
->cwmin
,
620 p
->cwmax
, p
->burst
)) {
621 wpa_printf(MSG_DEBUG
, "Failed to set TX queue "
622 "parameters for queue %d.", i
);
623 /* Continue anyway */
629 static int setup_interface(struct hostapd_iface
*iface
)
631 struct hostapd_data
*hapd
= iface
->bss
[0];
636 * Make sure that all BSSes get configured with a pointer to the same
639 for (i
= 1; i
< iface
->num_bss
; i
++) {
640 iface
->bss
[i
]->driver
= hapd
->driver
;
641 iface
->bss
[i
]->drv_priv
= hapd
->drv_priv
;
644 if (hostapd_validate_bssid_configuration(iface
))
647 if (hapd
->iconf
->country
[0] && hapd
->iconf
->country
[1]) {
648 os_memcpy(country
, hapd
->iconf
->country
, 3);
650 if (hostapd_set_country(hapd
, country
) < 0) {
651 wpa_printf(MSG_ERROR
, "Failed to set country code");
656 if (hostapd_get_hw_features(iface
)) {
657 /* Not all drivers support this yet, so continue without hw
660 int ret
= hostapd_select_hw_mode(iface
);
662 wpa_printf(MSG_ERROR
, "Could not select hw_mode and "
663 "channel. (%d)", ret
);
666 ret
= hostapd_check_ht_capab(iface
);
670 wpa_printf(MSG_DEBUG
, "Interface initialization will "
671 "be completed in a callback");
675 return hostapd_setup_interface_complete(iface
, 0);
679 int hostapd_setup_interface_complete(struct hostapd_iface
*iface
, int err
)
681 struct hostapd_data
*hapd
= iface
->bss
[0];
687 wpa_printf(MSG_ERROR
, "Interface initialization failed");
692 wpa_printf(MSG_DEBUG
, "Completing interface initialization");
693 if (hapd
->iconf
->channel
) {
694 freq
= hostapd_hw_get_freq(hapd
, hapd
->iconf
->channel
);
695 wpa_printf(MSG_DEBUG
, "Mode: %s Channel: %d "
697 hostapd_hw_mode_txt(hapd
->iconf
->hw_mode
),
698 hapd
->iconf
->channel
, freq
);
700 if (hostapd_set_freq(hapd
, hapd
->iconf
->hw_mode
, freq
,
701 hapd
->iconf
->channel
,
702 hapd
->iconf
->ieee80211n
,
703 hapd
->iconf
->secondary_channel
)) {
704 wpa_printf(MSG_ERROR
, "Could not set channel for "
710 if (hapd
->iconf
->rts_threshold
> -1 &&
711 hostapd_set_rts(hapd
, hapd
->iconf
->rts_threshold
)) {
712 wpa_printf(MSG_ERROR
, "Could not set RTS threshold for "
717 if (hapd
->iconf
->fragm_threshold
> -1 &&
718 hostapd_set_frag(hapd
, hapd
->iconf
->fragm_threshold
)) {
719 wpa_printf(MSG_ERROR
, "Could not set fragmentation threshold "
720 "for kernel driver");
724 prev_addr
= hapd
->own_addr
;
726 for (j
= 0; j
< iface
->num_bss
; j
++) {
727 hapd
= iface
->bss
[j
];
729 os_memcpy(hapd
->own_addr
, prev_addr
, ETH_ALEN
);
730 if (hostapd_setup_bss(hapd
, j
== 0))
732 if (hostapd_mac_comp_empty(hapd
->conf
->bssid
) == 0)
733 prev_addr
= hapd
->own_addr
;
736 hostapd_tx_queue_params(iface
);
740 if (hostapd_driver_commit(hapd
) < 0) {
741 wpa_printf(MSG_ERROR
, "%s: Failed to commit driver "
742 "configuration", __func__
);
746 wpa_printf(MSG_DEBUG
, "%s: Setup of interface done.",
747 iface
->bss
[0]->conf
->iface
);
754 * hostapd_setup_interface - Setup of an interface
755 * @iface: Pointer to interface data.
756 * Returns: 0 on success, -1 on failure
758 * Initializes the driver interface, validates the configuration,
759 * and sets driver parameters based on the configuration.
760 * Flushes old stations, sets the channel, encryption,
761 * beacons, and WDS links based on the configuration.
763 int hostapd_setup_interface(struct hostapd_iface
*iface
)
767 ret
= setup_interface(iface
);
769 wpa_printf(MSG_ERROR
, "%s: Unable to setup interface.",
770 iface
->bss
[0]->conf
->iface
);
779 * hostapd_alloc_bss_data - Allocate and initialize per-BSS data
780 * @hapd_iface: Pointer to interface data
781 * @conf: Pointer to per-interface configuration
782 * @bss: Pointer to per-BSS configuration for this BSS
783 * Returns: Pointer to allocated BSS data
785 * This function is used to allocate per-BSS data structure. This data will be
786 * freed after hostapd_cleanup() is called for it during interface
789 struct hostapd_data
*
790 hostapd_alloc_bss_data(struct hostapd_iface
*hapd_iface
,
791 struct hostapd_config
*conf
,
792 struct hostapd_bss_config
*bss
)
794 struct hostapd_data
*hapd
;
796 hapd
= os_zalloc(sizeof(*hapd
));
800 hostapd_set_driver_ops(&hapd
->drv
);
801 hapd
->new_assoc_sta_cb
= hostapd_new_assoc_sta
;
804 hapd
->iface
= hapd_iface
;
805 hapd
->driver
= hapd
->iconf
->driver
;
811 void hostapd_interface_deinit(struct hostapd_iface
*iface
)
818 hostapd_cleanup_iface_pre(iface
);
819 for (j
= 0; j
< iface
->num_bss
; j
++) {
820 struct hostapd_data
*hapd
= iface
->bss
[j
];
821 hostapd_free_stas(hapd
);
822 hostapd_flush_old_stations(hapd
);
823 hostapd_cleanup(hapd
);
828 void hostapd_interface_free(struct hostapd_iface
*iface
)
831 for (j
= 0; j
< iface
->num_bss
; j
++)
832 os_free(iface
->bss
[j
]);
833 hostapd_cleanup_iface(iface
);
838 * hostapd_new_assoc_sta - Notify that a new station associated with the AP
839 * @hapd: Pointer to BSS data
840 * @sta: Pointer to the associated STA data
841 * @reassoc: 1 to indicate this was a re-association; 0 = first association
843 * This function will be called whenever a station associates with the AP. It
844 * can be called from ieee802_11.c for drivers that export MLME to hostapd and
845 * from drv_callbacks.c based on driver events for drivers that take care of
846 * management frames (IEEE 802.11 authentication and association) internally.
848 void hostapd_new_assoc_sta(struct hostapd_data
*hapd
, struct sta_info
*sta
,
851 if (hapd
->tkip_countermeasures
) {
852 hapd
->drv
.sta_deauth(hapd
, sta
->addr
,
853 WLAN_REASON_MICHAEL_MIC_FAILURE
);
857 hostapd_prune_associations(hapd
, sta
->addr
);
859 /* IEEE 802.11F (IAPP) */
860 if (hapd
->conf
->ieee802_11f
)
861 iapp_new_station(hapd
->iapp
, sta
);
863 /* Start accounting here, if IEEE 802.1X and WPA are not used.
864 * IEEE 802.1X/WPA code will start accounting after the station has
865 * been authorized. */
866 if (!hapd
->conf
->ieee802_1x
&& !hapd
->conf
->wpa
)
867 accounting_sta_start(hapd
, sta
);
869 /* Start IEEE 802.1X authentication process for new stations */
870 ieee802_1x_new_station(hapd
, sta
);
872 if (sta
->auth_alg
!= WLAN_AUTH_FT
&&
873 !(sta
->flags
& (WLAN_STA_WPS
| WLAN_STA_MAYBE_WPS
)))
874 wpa_auth_sm_event(sta
->wpa_sm
, WPA_REAUTH
);
876 wpa_auth_sta_associated(hapd
->wpa_auth
, sta
->wpa_sm
);