hostapd: Verify hostapd_setup_bss calls

Reject multiple calls to hostapd_setup_bss() for any specific interface.
hostapd_cleanup() must have been called first before trying to restart a
BSS.

Signed-hostap: Jouni Malinen <jouni@qca.qualcomm.com>
This commit is contained in:
Jouni Malinen 2013-11-06 13:39:41 +02:00 committed by Jouni Malinen
parent 54246f8d44
commit 36501a22a4
2 changed files with 14 additions and 1 deletions

View file

@ -300,11 +300,13 @@ static void hostapd_free_hapd_data(struct hostapd_data *hapd)
*/ */
static void hostapd_cleanup(struct hostapd_data *hapd) static void hostapd_cleanup(struct hostapd_data *hapd)
{ {
wpa_printf(MSG_DEBUG, "%s(%s)", __func__, hapd->conf->iface); wpa_printf(MSG_DEBUG, "%s(hapd=%p (%s))", __func__, hapd,
hapd->conf->iface);
if (hapd->iface->interfaces && if (hapd->iface->interfaces &&
hapd->iface->interfaces->ctrl_iface_deinit) hapd->iface->interfaces->ctrl_iface_deinit)
hapd->iface->interfaces->ctrl_iface_deinit(hapd); hapd->iface->interfaces->ctrl_iface_deinit(hapd);
hostapd_free_hapd_data(hapd); hostapd_free_hapd_data(hapd);
hapd->started = 0;
} }
@ -621,6 +623,16 @@ static int hostapd_setup_bss(struct hostapd_data *hapd, int first)
char force_ifname[IFNAMSIZ]; char force_ifname[IFNAMSIZ];
u8 if_addr[ETH_ALEN]; u8 if_addr[ETH_ALEN];
wpa_printf(MSG_DEBUG, "%s(hapd=%p (%s), first=%d)",
__func__, hapd, hapd->conf->iface, first);
if (hapd->started) {
wpa_printf(MSG_ERROR, "%s: Interface %s was already started",
__func__, hapd->conf->iface);
return -1;
}
hapd->started = 1;
if (!first || first == -1) { if (!first || first == -1) {
if (hostapd_mac_comp_empty(hapd->conf->bssid) == 0) { if (hostapd_mac_comp_empty(hapd->conf->bssid) == 0) {
/* Allocate the next available BSSID. */ /* Allocate the next available BSSID. */

View file

@ -102,6 +102,7 @@ struct hostapd_data {
struct hostapd_config *iconf; struct hostapd_config *iconf;
struct hostapd_bss_config *conf; struct hostapd_bss_config *conf;
int interface_added; /* virtual interface added for this BSS */ int interface_added; /* virtual interface added for this BSS */
unsigned int started:1;
u8 own_addr[ETH_ALEN]; u8 own_addr[ETH_ALEN];