OWE: Transition mode information based on BSS ifname
The owe_transition_bssid and owe_transition_ssid parameters can now be replace with owe_transition_ifname to clone the BSSID/SSID information automatically in case the same hostapd process manages both the OWE and open BSS for transition mode. Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
This commit is contained in:
parent
89baf47104
commit
a891388184
6 changed files with 117 additions and 0 deletions
|
@ -3794,6 +3794,10 @@ static int hostapd_config_fill(struct hostapd_config *conf,
|
||||||
os_memcpy(bss->owe_transition_ssid, str, slen);
|
os_memcpy(bss->owe_transition_ssid, str, slen);
|
||||||
bss->owe_transition_ssid_len = slen;
|
bss->owe_transition_ssid_len = slen;
|
||||||
os_free(str);
|
os_free(str);
|
||||||
|
} else if (os_strcmp(buf, "owe_transition_ifname") == 0) {
|
||||||
|
os_strlcpy(bss->owe_transition_ifname, pos,
|
||||||
|
sizeof(bss->owe_transition_ifname));
|
||||||
|
|
||||||
#endif /* CONFIG_OWE */
|
#endif /* CONFIG_OWE */
|
||||||
} else {
|
} else {
|
||||||
wpa_printf(MSG_ERROR,
|
wpa_printf(MSG_ERROR,
|
||||||
|
|
|
@ -1412,6 +1412,9 @@ own_ip_addr=127.0.0.1
|
||||||
#owe_transition_bssid=<bssid>
|
#owe_transition_bssid=<bssid>
|
||||||
# SSID in same format as ssid2 described above.
|
# SSID in same format as ssid2 described above.
|
||||||
#owe_transition_ssid=<SSID>
|
#owe_transition_ssid=<SSID>
|
||||||
|
# Alternatively, OWE transition mode BSSID/SSID can be configured with a
|
||||||
|
# reference to a BSS operated by this hostapd process.
|
||||||
|
#owe_transition_ifname=<ifname>
|
||||||
|
|
||||||
# DHCP server for FILS HLP
|
# DHCP server for FILS HLP
|
||||||
# If configured, hostapd will act as a DHCP relay for all FILS HLP requests
|
# If configured, hostapd will act as a DHCP relay for all FILS HLP requests
|
||||||
|
|
|
@ -649,6 +649,7 @@ struct hostapd_bss_config {
|
||||||
macaddr owe_transition_bssid;
|
macaddr owe_transition_bssid;
|
||||||
u8 owe_transition_ssid[SSID_MAX_LEN];
|
u8 owe_transition_ssid[SSID_MAX_LEN];
|
||||||
size_t owe_transition_ssid_len;
|
size_t owe_transition_ssid_len;
|
||||||
|
char owe_transition_ifname[IFNAMSIZ + 1];
|
||||||
#endif /* CONFIG_OWE */
|
#endif /* CONFIG_OWE */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -391,6 +391,10 @@ static u8 * hostapd_eid_owe_trans(struct hostapd_data *hapd, u8 *eid,
|
||||||
u8 *pos = eid;
|
u8 *pos = eid;
|
||||||
size_t elen;
|
size_t elen;
|
||||||
|
|
||||||
|
if (hapd->conf->owe_transition_ifname[0] &&
|
||||||
|
!hostapd_eid_owe_trans_enabled(hapd))
|
||||||
|
hostapd_owe_trans_get_info(hapd);
|
||||||
|
|
||||||
if (!hostapd_eid_owe_trans_enabled(hapd))
|
if (!hostapd_eid_owe_trans_enabled(hapd))
|
||||||
return pos;
|
return pos;
|
||||||
|
|
||||||
|
|
104
src/ap/hostapd.c
104
src/ap/hostapd.c
|
@ -1680,6 +1680,108 @@ static void hostapd_set_own_neighbor_report(struct hostapd_data *hapd)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef CONFIG_OWE
|
||||||
|
|
||||||
|
static int hostapd_owe_iface_iter(struct hostapd_iface *iface, void *ctx)
|
||||||
|
{
|
||||||
|
struct hostapd_data *hapd = ctx;
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < iface->num_bss; i++) {
|
||||||
|
struct hostapd_data *bss = iface->bss[i];
|
||||||
|
|
||||||
|
if (os_strcmp(hapd->conf->owe_transition_ifname,
|
||||||
|
bss->conf->iface) != 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
wpa_printf(MSG_DEBUG,
|
||||||
|
"OWE: ifname=%s found transition mode ifname=%s BSSID "
|
||||||
|
MACSTR " SSID %s",
|
||||||
|
hapd->conf->iface, bss->conf->iface,
|
||||||
|
MAC2STR(bss->own_addr),
|
||||||
|
wpa_ssid_txt(bss->conf->ssid.ssid,
|
||||||
|
bss->conf->ssid.ssid_len));
|
||||||
|
if (!bss->conf->ssid.ssid_set || !bss->conf->ssid.ssid_len ||
|
||||||
|
is_zero_ether_addr(bss->own_addr))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
os_memcpy(hapd->conf->owe_transition_bssid, bss->own_addr,
|
||||||
|
ETH_ALEN);
|
||||||
|
os_memcpy(hapd->conf->owe_transition_ssid,
|
||||||
|
bss->conf->ssid.ssid, bss->conf->ssid.ssid_len);
|
||||||
|
hapd->conf->owe_transition_ssid_len = bss->conf->ssid.ssid_len;
|
||||||
|
wpa_printf(MSG_DEBUG,
|
||||||
|
"OWE: Copied transition mode information");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int hostapd_owe_trans_get_info(struct hostapd_data *hapd)
|
||||||
|
{
|
||||||
|
if (hapd->conf->owe_transition_ssid_len > 0 &&
|
||||||
|
!is_zero_ether_addr(hapd->conf->owe_transition_bssid))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/* Find transition mode SSID/BSSID information from a BSS operated by
|
||||||
|
* this hostapd instance. */
|
||||||
|
if (!hapd->iface->interfaces ||
|
||||||
|
!hapd->iface->interfaces->for_each_interface)
|
||||||
|
return hostapd_owe_iface_iter(hapd->iface, hapd);
|
||||||
|
else
|
||||||
|
return hapd->iface->interfaces->for_each_interface(
|
||||||
|
hapd->iface->interfaces, hostapd_owe_iface_iter, hapd);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int hostapd_owe_iface_iter2(struct hostapd_iface *iface, void *ctx)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < iface->num_bss; i++) {
|
||||||
|
struct hostapd_data *bss = iface->bss[i];
|
||||||
|
int res;
|
||||||
|
|
||||||
|
wpa_printf(MSG_DEBUG, "JKM:%s:iface=%s trans_ifname=%s",
|
||||||
|
__func__, bss->conf->iface,
|
||||||
|
bss->conf->owe_transition_ifname);
|
||||||
|
if (!bss->conf->owe_transition_ifname[0])
|
||||||
|
continue;
|
||||||
|
res = hostapd_owe_trans_get_info(bss);
|
||||||
|
wpa_printf(MSG_DEBUG, "JKM:%s:iface=%s trans_ifname=%s res=%d",
|
||||||
|
__func__, bss->conf->iface,
|
||||||
|
bss->conf->owe_transition_ifname, res);
|
||||||
|
if (res == 0)
|
||||||
|
continue;
|
||||||
|
wpa_printf(MSG_DEBUG,
|
||||||
|
"OWE: Matching transition mode interface enabled - update beacon data for %s",
|
||||||
|
bss->conf->iface);
|
||||||
|
ieee802_11_set_beacon(bss);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* CONFIG_OWE */
|
||||||
|
|
||||||
|
|
||||||
|
static void hostapd_owe_update_trans(struct hostapd_iface *iface)
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_OWE
|
||||||
|
/* Check whether the enabled BSS can complete OWE transition mode
|
||||||
|
* configuration for any pending interface. */
|
||||||
|
if (!iface->interfaces ||
|
||||||
|
!iface->interfaces->for_each_interface)
|
||||||
|
hostapd_owe_iface_iter2(iface, NULL);
|
||||||
|
else
|
||||||
|
iface->interfaces->for_each_interface(
|
||||||
|
iface->interfaces, hostapd_owe_iface_iter2, NULL);
|
||||||
|
#endif /* CONFIG_OWE */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int hostapd_setup_interface_complete_sync(struct hostapd_iface *iface,
|
static int hostapd_setup_interface_complete_sync(struct hostapd_iface *iface,
|
||||||
int err)
|
int err)
|
||||||
{
|
{
|
||||||
|
@ -1855,6 +1957,7 @@ dfs_offload:
|
||||||
#endif /* CONFIG_FST */
|
#endif /* CONFIG_FST */
|
||||||
|
|
||||||
hostapd_set_state(iface, HAPD_IFACE_ENABLED);
|
hostapd_set_state(iface, HAPD_IFACE_ENABLED);
|
||||||
|
hostapd_owe_update_trans(iface);
|
||||||
wpa_msg(iface->bss[0]->msg_ctx, MSG_INFO, AP_EVENT_ENABLED);
|
wpa_msg(iface->bss[0]->msg_ctx, MSG_INFO, AP_EVENT_ENABLED);
|
||||||
if (hapd->setup_complete_cb)
|
if (hapd->setup_complete_cb)
|
||||||
hapd->setup_complete_cb(hapd->setup_complete_cb_ctx);
|
hapd->setup_complete_cb(hapd->setup_complete_cb_ctx);
|
||||||
|
@ -2646,6 +2749,7 @@ int hostapd_add_iface(struct hapd_interfaces *interfaces, char *buf)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
hostapd_owe_update_trans(hapd_iface);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -545,6 +545,7 @@ hostapd_switch_channel_fallback(struct hostapd_iface *iface,
|
||||||
const struct hostapd_freq_params *freq_params);
|
const struct hostapd_freq_params *freq_params);
|
||||||
void hostapd_cleanup_cs_params(struct hostapd_data *hapd);
|
void hostapd_cleanup_cs_params(struct hostapd_data *hapd);
|
||||||
void hostapd_periodic_iface(struct hostapd_iface *iface);
|
void hostapd_periodic_iface(struct hostapd_iface *iface);
|
||||||
|
int hostapd_owe_trans_get_info(struct hostapd_data *hapd);
|
||||||
|
|
||||||
/* utils.c */
|
/* utils.c */
|
||||||
int hostapd_register_probereq_cb(struct hostapd_data *hapd,
|
int hostapd_register_probereq_cb(struct hostapd_data *hapd,
|
||||||
|
|
Loading…
Reference in a new issue