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:
parent
ccdff94035
commit
a679c0f284
4 changed files with 24 additions and 3 deletions
|
@ -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) {
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue