WPS: Allow hostapd process to control independent WPS interfaces

The new wps_independent=1 configuration parameter can be used to remove
interfaces from the shared hostapd process WPS control (i.e., to apply
WPS operations only to a subset of interfaces instead of all).

Signed-hostap: Jouni Malinen <j@w1.fi>
This commit is contained in:
Jouni Malinen 2013-03-31 11:48:52 +03:00
parent ccdff94035
commit a679c0f284
4 changed files with 24 additions and 3 deletions

View file

@ -2509,6 +2509,8 @@ static int hostapd_config_fill(struct hostapd_config *conf,
"wps_state", line); "wps_state", line);
errors++; errors++;
} }
} else if (os_strcmp(buf, "wps_independent") == 0) {
bss->wps_independent = atoi(pos);
} else if (os_strcmp(buf, "ap_setup_locked") == 0) { } else if (os_strcmp(buf, "ap_setup_locked") == 0) {
bss->ap_setup_locked = atoi(pos); bss->ap_setup_locked = atoi(pos);
} else if (os_strcmp(buf, "uuid") == 0) { } else if (os_strcmp(buf, "uuid") == 0) {

View file

@ -1124,6 +1124,14 @@ own_ip_addr=127.0.0.1
# 2 = WPS enabled, configured # 2 = WPS enabled, configured
#wps_state=2 #wps_state=2
# Whether to manage this interface independently from other WPS interfaces
# By default, a single hostapd process applies WPS operations to all configured
# interfaces. This parameter can be used to disable that behavior for a subset
# of interfaces. If this is set to non-zero for an interface, WPS commands
# issued on that interface do not apply to other interfaces and WPS operations
# performed on other interfaces do not affect this interface.
#wps_independent=0
# AP can be configured into a locked state where new WPS Registrar are not # AP can be configured into a locked state where new WPS Registrar are not
# accepted, but previously authorized Registrars (including the internal one) # accepted, but previously authorized Registrars (including the internal one)
# can continue to add new Enrollees. # can continue to add new Enrollees.

View file

@ -340,6 +340,7 @@ struct hostapd_bss_config {
int wps_state; int wps_state;
#ifdef CONFIG_WPS #ifdef CONFIG_WPS
int wps_independent;
int ap_setup_locked; int ap_setup_locked;
u8 uuid[16]; u8 uuid[16];
char *wps_pin_requests; char *wps_pin_requests;

View file

@ -45,6 +45,7 @@ static void hostapd_wps_ap_pin_timeout(void *eloop_data, void *user_ctx);
struct wps_for_each_data { struct wps_for_each_data {
int (*func)(struct hostapd_data *h, void *ctx); int (*func)(struct hostapd_data *h, void *ctx);
void *ctx; void *ctx;
struct hostapd_data *calling_hapd;
}; };
@ -57,7 +58,14 @@ static int wps_for_each(struct hostapd_iface *iface, void *ctx)
return 0; return 0;
for (j = 0; j < iface->num_bss; j++) { for (j = 0; j < iface->num_bss; j++) {
struct hostapd_data *hapd = iface->bss[j]; struct hostapd_data *hapd = iface->bss[j];
int ret = data->func(hapd, data->ctx); int ret;
if (hapd != data->calling_hapd &&
(hapd->conf->wps_independent ||
data->calling_hapd->conf->wps_independent))
continue;
ret = data->func(hapd, data->ctx);
if (ret) if (ret)
return ret; return ret;
} }
@ -74,6 +82,7 @@ static int hostapd_wps_for_each(struct hostapd_data *hapd,
struct wps_for_each_data data; struct wps_for_each_data data;
data.func = func; data.func = func;
data.ctx = ctx; data.ctx = ctx;
data.calling_hapd = hapd;
if (iface->interfaces == NULL || if (iface->interfaces == NULL ||
iface->interfaces->for_each_interface == NULL) iface->interfaces->for_each_interface == NULL)
return wps_for_each(iface, &data); return wps_for_each(iface, &data);
@ -814,7 +823,8 @@ static int get_uuid_cb(struct hostapd_iface *iface, void *ctx)
return 0; return 0;
for (j = 0; j < iface->num_bss; j++) { for (j = 0; j < iface->num_bss; j++) {
struct hostapd_data *hapd = iface->bss[j]; struct hostapd_data *hapd = iface->bss[j];
if (hapd->wps && !is_nil_uuid(hapd->wps->uuid)) { if (hapd->wps && !hapd->conf->wps_independent &&
!is_nil_uuid(hapd->wps->uuid)) {
*uuid = hapd->wps->uuid; *uuid = hapd->wps->uuid;
return 1; return 1;
} }
@ -907,7 +917,7 @@ int hostapd_init_wps(struct hostapd_data *hapd,
if (is_nil_uuid(hapd->conf->uuid)) { if (is_nil_uuid(hapd->conf->uuid)) {
const u8 *uuid; const u8 *uuid;
uuid = get_own_uuid(hapd->iface); uuid = get_own_uuid(hapd->iface);
if (uuid) { if (uuid && !conf->wps_independent) {
os_memcpy(wps->uuid, uuid, UUID_LEN); os_memcpy(wps->uuid, uuid, UUID_LEN);
wpa_hexdump(MSG_DEBUG, "WPS: Clone UUID from another " wpa_hexdump(MSG_DEBUG, "WPS: Clone UUID from another "
"interface", wps->uuid, UUID_LEN); "interface", wps->uuid, UUID_LEN);