AP MLD: Use MLD struct for MLD level information
MLD level structure is present to store the MLD level information. Add changes to use the MLD structure instead of link specific struct hostapd_data to get/set the MLD level information. Signed-off-by: Aditya Kumar Singh <quic_adisi@quicinc.com>
This commit is contained in:
parent
2f0e5303e8
commit
b19aa9c422
13 changed files with 136 additions and 61 deletions
|
@ -1944,7 +1944,7 @@ static int hostapd_ctrl_iface_data_test_config(struct hostapd_data *hapd,
|
||||||
|
|
||||||
#ifdef CONFIG_IEEE80211BE
|
#ifdef CONFIG_IEEE80211BE
|
||||||
if (hapd->conf->mld_ap)
|
if (hapd->conf->mld_ap)
|
||||||
addr = hapd->mld_addr;
|
addr = hapd->mld->mld_addr;
|
||||||
#endif /* CONFIG_IEEE80211BE */
|
#endif /* CONFIG_IEEE80211BE */
|
||||||
hapd->l2_test = l2_packet_init(ifname, addr,
|
hapd->l2_test = l2_packet_init(ifname, addr,
|
||||||
ETHERTYPE_IP, hostapd_data_test_rx,
|
ETHERTYPE_IP, hostapd_data_test_rx,
|
||||||
|
@ -3519,7 +3519,7 @@ static int hostapd_ctrl_iface_disable_mld(struct hostapd_iface *iface)
|
||||||
if (!hostapd_is_ml_partner(h_hapd, iface->bss[0]))
|
if (!hostapd_is_ml_partner(h_hapd, iface->bss[0]))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!h_hapd->mld_first_bss) {
|
if (hostapd_mld_is_first_bss(h_hapd)) {
|
||||||
first_iface = h_iface;
|
first_iface = h_iface;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -3536,7 +3536,7 @@ static int hostapd_ctrl_iface_disable_mld(struct hostapd_iface *iface)
|
||||||
struct hostapd_data *h_hapd = h_iface->bss[0];
|
struct hostapd_data *h_hapd = h_iface->bss[0];
|
||||||
|
|
||||||
if (!hostapd_is_ml_partner(h_hapd, iface->bss[0]) ||
|
if (!hostapd_is_ml_partner(h_hapd, iface->bss[0]) ||
|
||||||
!h_hapd->mld_first_bss)
|
hostapd_mld_is_first_bss(h_hapd))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (hostapd_disable_iface(h_iface)) {
|
if (hostapd_disable_iface(h_iface)) {
|
||||||
|
|
|
@ -204,20 +204,16 @@ static int hostapd_driver_init(struct hostapd_iface *iface)
|
||||||
* is not configured, and otherwise it would be the
|
* is not configured, and otherwise it would be the
|
||||||
* configured BSSID.
|
* configured BSSID.
|
||||||
*/
|
*/
|
||||||
os_memcpy(hapd->mld_addr, h_hapd->mld_addr, ETH_ALEN);
|
|
||||||
if (is_zero_ether_addr(b)) {
|
if (is_zero_ether_addr(b)) {
|
||||||
os_memcpy(hapd->own_addr, h_hapd->mld_addr, ETH_ALEN);
|
os_memcpy(hapd->own_addr, h_hapd->mld->mld_addr,
|
||||||
|
ETH_ALEN);
|
||||||
random_mac_addr_keep_oui(hapd->own_addr);
|
random_mac_addr_keep_oui(hapd->own_addr);
|
||||||
} else {
|
} else {
|
||||||
os_memcpy(hapd->own_addr, b, ETH_ALEN);
|
os_memcpy(hapd->own_addr, b, ETH_ALEN);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
hapd->mld_link_id = hapd->mld->next_link_id++;
|
||||||
* Mark the interface as a secondary interface, as this
|
hostapd_mld_add_link(hapd);
|
||||||
* is needed for the de-initialization flow
|
|
||||||
*/
|
|
||||||
hapd->mld_first_bss = h_hapd;
|
|
||||||
hapd->mld_link_id = hapd->mld_first_bss->mld_next_link_id++;
|
|
||||||
|
|
||||||
goto setup_mld;
|
goto setup_mld;
|
||||||
}
|
}
|
||||||
|
@ -294,13 +290,15 @@ static int hostapd_driver_init(struct hostapd_iface *iface)
|
||||||
* configured, and otherwise it would be the configured BSSID.
|
* configured, and otherwise it would be the configured BSSID.
|
||||||
*/
|
*/
|
||||||
if (hapd->conf->mld_ap) {
|
if (hapd->conf->mld_ap) {
|
||||||
os_memcpy(hapd->mld_addr, hapd->own_addr, ETH_ALEN);
|
os_memcpy(hapd->mld->mld_addr, hapd->own_addr, ETH_ALEN);
|
||||||
hapd->mld_next_link_id = 0;
|
|
||||||
hapd->mld_link_id = hapd->mld_next_link_id++;
|
|
||||||
if (!b)
|
if (!b)
|
||||||
random_mac_addr_keep_oui(hapd->own_addr);
|
random_mac_addr_keep_oui(hapd->own_addr);
|
||||||
else
|
else
|
||||||
os_memcpy(hapd->own_addr, b, ETH_ALEN);
|
os_memcpy(hapd->own_addr, b, ETH_ALEN);
|
||||||
|
|
||||||
|
hapd->mld_link_id = hapd->mld->next_link_id++;
|
||||||
|
hostapd_mld_add_link(hapd);
|
||||||
}
|
}
|
||||||
|
|
||||||
setup_mld:
|
setup_mld:
|
||||||
|
@ -354,7 +352,7 @@ setup_mld:
|
||||||
wpa_printf(MSG_DEBUG,
|
wpa_printf(MSG_DEBUG,
|
||||||
"MLD: Set link_id=%u, mld_addr=" MACSTR
|
"MLD: Set link_id=%u, mld_addr=" MACSTR
|
||||||
", own_addr=" MACSTR,
|
", own_addr=" MACSTR,
|
||||||
hapd->mld_link_id, MAC2STR(hapd->mld_addr),
|
hapd->mld_link_id, MAC2STR(hapd->mld->mld_addr),
|
||||||
MAC2STR(hapd->own_addr));
|
MAC2STR(hapd->own_addr));
|
||||||
|
|
||||||
hostapd_drv_link_add(hapd, hapd->mld_link_id,
|
hostapd_drv_link_add(hapd, hapd->mld_link_id,
|
||||||
|
|
|
@ -842,7 +842,7 @@ int hostapd_drv_sta_deauth(struct hostapd_data *hapd,
|
||||||
|
|
||||||
link_id = hapd->mld_link_id;
|
link_id = hapd->mld_link_id;
|
||||||
if (ap_sta_is_mld(hapd, sta))
|
if (ap_sta_is_mld(hapd, sta))
|
||||||
own_addr = hapd->mld_addr;
|
own_addr = hapd->mld->mld_addr;
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_IEEE80211BE */
|
#endif /* CONFIG_IEEE80211BE */
|
||||||
|
|
||||||
|
@ -863,7 +863,7 @@ int hostapd_drv_sta_disassoc(struct hostapd_data *hapd,
|
||||||
struct sta_info *sta = ap_get_sta(hapd, addr);
|
struct sta_info *sta = ap_get_sta(hapd, addr);
|
||||||
|
|
||||||
if (ap_sta_is_mld(hapd, sta))
|
if (ap_sta_is_mld(hapd, sta))
|
||||||
own_addr = hapd->mld_addr;
|
own_addr = hapd->mld->mld_addr;
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_IEEE80211BE */
|
#endif /* CONFIG_IEEE80211BE */
|
||||||
|
|
||||||
|
@ -921,7 +921,7 @@ static int hapd_drv_send_action(struct hostapd_data *hapd, unsigned int freq,
|
||||||
sta = ap_get_sta(hapd, dst);
|
sta = ap_get_sta(hapd, dst);
|
||||||
|
|
||||||
if (ap_sta_is_mld(hapd, sta)) {
|
if (ap_sta_is_mld(hapd, sta)) {
|
||||||
own_addr = hapd->mld_addr;
|
own_addr = hapd->mld->mld_addr;
|
||||||
bssid = own_addr;
|
bssid = own_addr;
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_IEEE80211BE */
|
#endif /* CONFIG_IEEE80211BE */
|
||||||
|
|
|
@ -107,13 +107,20 @@ static int hostapd_setup_radius_srv(struct hostapd_data *hapd)
|
||||||
struct radius_server_conf srv;
|
struct radius_server_conf srv;
|
||||||
struct hostapd_bss_config *conf = hapd->conf;
|
struct hostapd_bss_config *conf = hapd->conf;
|
||||||
|
|
||||||
if (hapd->mld_first_bss) {
|
#ifdef CONFIG_IEEE80211BE
|
||||||
|
if (!hostapd_mld_is_first_bss(hapd)) {
|
||||||
|
struct hostapd_data *first;
|
||||||
|
|
||||||
wpa_printf(MSG_DEBUG,
|
wpa_printf(MSG_DEBUG,
|
||||||
"MLD: Using RADIUS server of the first BSS");
|
"MLD: Using RADIUS server of the first BSS");
|
||||||
|
|
||||||
hapd->radius_srv = hapd->mld_first_bss->radius_srv;
|
first = hostapd_mld_get_first_bss(hapd);
|
||||||
|
if (!first)
|
||||||
|
return -1;
|
||||||
|
hapd->radius_srv = first->radius_srv;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
#endif /* CONFIG_IEEE80211BE */
|
||||||
|
|
||||||
os_memset(&srv, 0, sizeof(srv));
|
os_memset(&srv, 0, sizeof(srv));
|
||||||
srv.client_file = conf->radius_server_clients;
|
srv.client_file = conf->radius_server_clients;
|
||||||
|
@ -249,18 +256,25 @@ static struct eap_config * authsrv_eap_config(struct hostapd_data *hapd)
|
||||||
|
|
||||||
int authsrv_init(struct hostapd_data *hapd)
|
int authsrv_init(struct hostapd_data *hapd)
|
||||||
{
|
{
|
||||||
if (hapd->mld_first_bss) {
|
#ifdef CONFIG_IEEE80211BE
|
||||||
|
if (!hostapd_mld_is_first_bss(hapd)) {
|
||||||
|
struct hostapd_data *first;
|
||||||
|
|
||||||
wpa_printf(MSG_DEBUG, "MLD: Using auth_serv of the first BSS");
|
wpa_printf(MSG_DEBUG, "MLD: Using auth_serv of the first BSS");
|
||||||
|
|
||||||
|
first = hostapd_mld_get_first_bss(hapd);
|
||||||
|
if (!first)
|
||||||
|
return -1;
|
||||||
#ifdef EAP_TLS_FUNCS
|
#ifdef EAP_TLS_FUNCS
|
||||||
hapd->ssl_ctx = hapd->mld_first_bss->ssl_ctx;
|
hapd->ssl_ctx = first->ssl_ctx;
|
||||||
#endif /* EAP_TLS_FUNCS */
|
#endif /* EAP_TLS_FUNCS */
|
||||||
hapd->eap_cfg = hapd->mld_first_bss->eap_cfg;
|
hapd->eap_cfg = first->eap_cfg;
|
||||||
#ifdef EAP_SIM_DB
|
#ifdef EAP_SIM_DB
|
||||||
hapd->eap_sim_db_priv = hapd->mld_first_bss->eap_sim_db_priv;
|
hapd->eap_sim_db_priv = first->eap_sim_db_priv;
|
||||||
#endif /* EAP_SIM_DB */
|
#endif /* EAP_SIM_DB */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
#endif /* CONFIG_IEEE80211BE */
|
||||||
|
|
||||||
#ifdef EAP_TLS_FUNCS
|
#ifdef EAP_TLS_FUNCS
|
||||||
if (hapd->conf->eap_server &&
|
if (hapd->conf->eap_server &&
|
||||||
|
@ -376,7 +390,8 @@ int authsrv_init(struct hostapd_data *hapd)
|
||||||
|
|
||||||
void authsrv_deinit(struct hostapd_data *hapd)
|
void authsrv_deinit(struct hostapd_data *hapd)
|
||||||
{
|
{
|
||||||
if (hapd->mld_first_bss) {
|
#ifdef CONFIG_IEEE80211BE
|
||||||
|
if (!hostapd_mld_is_first_bss(hapd)) {
|
||||||
wpa_printf(MSG_DEBUG,
|
wpa_printf(MSG_DEBUG,
|
||||||
"MLD: Deinit auth_serv of a non-first BSS");
|
"MLD: Deinit auth_serv of a non-first BSS");
|
||||||
|
|
||||||
|
@ -390,6 +405,7 @@ void authsrv_deinit(struct hostapd_data *hapd)
|
||||||
#endif /* EAP_TLS_FUNCS */
|
#endif /* EAP_TLS_FUNCS */
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
#endif /* CONFIG_IEEE80211BE */
|
||||||
|
|
||||||
#ifdef RADIUS_SERVER
|
#ifdef RADIUS_SERVER
|
||||||
radius_server_deinit(hapd->radius_srv);
|
radius_server_deinit(hapd->radius_srv);
|
||||||
|
|
|
@ -1012,7 +1012,7 @@ int hostapd_ctrl_iface_status(struct hostapd_data *hapd, char *buf,
|
||||||
"mld_addr[%d]=" MACSTR "\n"
|
"mld_addr[%d]=" MACSTR "\n"
|
||||||
"mld_id[%d]=%d\n"
|
"mld_id[%d]=%d\n"
|
||||||
"mld_link_id[%d]=%d\n",
|
"mld_link_id[%d]=%d\n",
|
||||||
(int) i, MAC2STR(bss->mld_addr),
|
(int) i, MAC2STR(bss->mld->mld_addr),
|
||||||
(int) i, hostapd_get_mld_id(bss),
|
(int) i, hostapd_get_mld_id(bss),
|
||||||
(int) i, bss->mld_link_id);
|
(int) i, bss->mld_link_id);
|
||||||
if (os_snprintf_error(buflen - len, ret))
|
if (os_snprintf_error(buflen - len, ret))
|
||||||
|
|
|
@ -517,7 +517,7 @@ int hostapd_notif_assoc(struct hostapd_data *hapd, const u8 *addr,
|
||||||
if (ap_sta_is_mld(hapd, sta)) {
|
if (ap_sta_is_mld(hapd, sta)) {
|
||||||
wpa_printf(MSG_DEBUG,
|
wpa_printf(MSG_DEBUG,
|
||||||
"MLD: Set ML info in RSN Authenticator");
|
"MLD: Set ML info in RSN Authenticator");
|
||||||
wpa_auth_set_ml_info(sta->wpa_sm, hapd->mld_addr,
|
wpa_auth_set_ml_info(sta->wpa_sm, hapd->mld->mld_addr,
|
||||||
sta->mld_assoc_link_id,
|
sta->mld_assoc_link_id,
|
||||||
&sta->mld_info);
|
&sta->mld_info);
|
||||||
}
|
}
|
||||||
|
@ -1815,7 +1815,7 @@ static int hostapd_mgmt_rx(struct hostapd_data *hapd, struct rx_mgmt *rx_mgmt)
|
||||||
|
|
||||||
#ifdef CONFIG_IEEE80211BE
|
#ifdef CONFIG_IEEE80211BE
|
||||||
if (hapd->conf->mld_ap &&
|
if (hapd->conf->mld_ap &&
|
||||||
ether_addr_equal(hapd->mld_addr, bssid))
|
ether_addr_equal(hapd->mld->mld_addr, bssid))
|
||||||
is_mld = true;
|
is_mld = true;
|
||||||
#endif /* CONFIG_IEEE80211BE */
|
#endif /* CONFIG_IEEE80211BE */
|
||||||
|
|
||||||
|
@ -1887,7 +1887,8 @@ static void hostapd_mgmt_tx_cb(struct hostapd_data *hapd, const u8 *buf,
|
||||||
hapd = tmp_hapd;
|
hapd = tmp_hapd;
|
||||||
#ifdef CONFIG_IEEE80211BE
|
#ifdef CONFIG_IEEE80211BE
|
||||||
} else if (hapd->conf->mld_ap &&
|
} else if (hapd->conf->mld_ap &&
|
||||||
ether_addr_equal(hapd->mld_addr, get_hdr_bssid(hdr, len))) {
|
ether_addr_equal(hapd->mld->mld_addr,
|
||||||
|
get_hdr_bssid(hdr, len))) {
|
||||||
/* AP MLD address match - use hapd pointer as-is */
|
/* AP MLD address match - use hapd pointer as-is */
|
||||||
#endif /* CONFIG_IEEE80211BE */
|
#endif /* CONFIG_IEEE80211BE */
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -399,6 +399,7 @@ static int hostapd_broadcast_wep_set(struct hostapd_data *hapd)
|
||||||
|
|
||||||
static void hostapd_clear_drv_priv(struct hostapd_data *hapd)
|
static void hostapd_clear_drv_priv(struct hostapd_data *hapd)
|
||||||
{
|
{
|
||||||
|
#ifdef CONFIG_IEEE80211BE
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
for (i = 0; i < hapd->iface->interfaces->count; i++) {
|
for (i = 0; i < hapd->iface->interfaces->count; i++) {
|
||||||
|
@ -408,9 +409,10 @@ static void hostapd_clear_drv_priv(struct hostapd_data *hapd)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (iface->bss && iface->bss[0] &&
|
if (iface->bss && iface->bss[0] &&
|
||||||
iface->bss[0]->mld_first_bss == hapd)
|
hostapd_mld_get_first_bss(iface->bss[0]) == hapd)
|
||||||
iface->bss[0]->drv_priv = NULL;
|
iface->bss[0]->drv_priv = NULL;
|
||||||
}
|
}
|
||||||
|
#endif /* CONFIG_IEEE80211BE */
|
||||||
|
|
||||||
hapd->drv_priv = NULL;
|
hapd->drv_priv = NULL;
|
||||||
}
|
}
|
||||||
|
@ -498,7 +500,8 @@ void hostapd_free_hapd_data(struct hostapd_data *hapd)
|
||||||
vlan_deinit(hapd);
|
vlan_deinit(hapd);
|
||||||
hostapd_acl_deinit(hapd);
|
hostapd_acl_deinit(hapd);
|
||||||
#ifndef CONFIG_NO_RADIUS
|
#ifndef CONFIG_NO_RADIUS
|
||||||
if (!hapd->mld_first_bss) {
|
if (hostapd_mld_is_first_bss(hapd)) {
|
||||||
|
#ifdef CONFIG_IEEE80211BE
|
||||||
struct hapd_interfaces *ifaces = hapd->iface->interfaces;
|
struct hapd_interfaces *ifaces = hapd->iface->interfaces;
|
||||||
size_t i;
|
size_t i;
|
||||||
|
|
||||||
|
@ -517,6 +520,7 @@ void hostapd_free_hapd_data(struct hostapd_data *hapd)
|
||||||
h->radius_das = NULL;
|
h->radius_das = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif /* CONFIG_IEEE80211BE */
|
||||||
radius_client_deinit(hapd->radius);
|
radius_client_deinit(hapd->radius);
|
||||||
radius_das_deinit(hapd->radius_das);
|
radius_das_deinit(hapd->radius_das);
|
||||||
}
|
}
|
||||||
|
@ -616,6 +620,41 @@ void hostapd_free_hapd_data(struct hostapd_data *hapd)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* hostapd_bss_link_deinit - Per-BSS ML cleanup (deinitialization)
|
||||||
|
* @hapd: Pointer to BSS data
|
||||||
|
*
|
||||||
|
* This function is used to unlink the BSS from the AP MLD.
|
||||||
|
* If the BSS being removed is the first link, the next link becomes the first
|
||||||
|
* link.
|
||||||
|
*/
|
||||||
|
static void hostapd_bss_link_deinit(struct hostapd_data *hapd)
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_IEEE80211BE
|
||||||
|
if (!hapd->conf || !hapd->conf->mld_ap)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!hapd->mld->num_links)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* If not started, not yet linked to the MLD. However, the first
|
||||||
|
* BSS is always linked since it is linked during driver_init(), and
|
||||||
|
* hence, need to remove it from the AP MLD.
|
||||||
|
*/
|
||||||
|
if (!hapd->started && hapd->iface->bss[0] != hapd)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* The first BSS can also be only linked when at least driver_init() is
|
||||||
|
* executed. But if previous interface fails, it is not, and hence,
|
||||||
|
* safe to skip.
|
||||||
|
*/
|
||||||
|
if (hapd->iface->bss[0] == hapd && !hapd->drv_priv)
|
||||||
|
return;
|
||||||
|
|
||||||
|
hostapd_mld_remove_link(hapd);
|
||||||
|
#endif /* CONFIG_IEEE80211BE */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* hostapd_cleanup - Per-BSS cleanup (deinitialization)
|
* hostapd_cleanup - Per-BSS cleanup (deinitialization)
|
||||||
* @hapd: Pointer to BSS data
|
* @hapd: Pointer to BSS data
|
||||||
|
@ -1305,7 +1344,7 @@ static int hostapd_setup_bss(struct hostapd_data *hapd, int first,
|
||||||
u8 if_addr[ETH_ALEN];
|
u8 if_addr[ETH_ALEN];
|
||||||
int flush_old_stations = 1;
|
int flush_old_stations = 1;
|
||||||
|
|
||||||
if (hapd->mld_first_bss)
|
if (!hostapd_mld_is_first_bss(hapd))
|
||||||
wpa_printf(MSG_DEBUG,
|
wpa_printf(MSG_DEBUG,
|
||||||
"MLD: %s: Setting non-first BSS", __func__);
|
"MLD: %s: Setting non-first BSS", __func__);
|
||||||
|
|
||||||
|
@ -1467,7 +1506,7 @@ static int hostapd_setup_bss(struct hostapd_data *hapd, int first,
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_SQLITE */
|
#endif /* CONFIG_SQLITE */
|
||||||
|
|
||||||
if (!hapd->mld_first_bss) {
|
if (hostapd_mld_is_first_bss(hapd)) {
|
||||||
hapd->radius = radius_client_init(hapd, conf->radius);
|
hapd->radius = radius_client_init(hapd, conf->radius);
|
||||||
if (!hapd->radius) {
|
if (!hapd->radius) {
|
||||||
wpa_printf(MSG_ERROR,
|
wpa_printf(MSG_ERROR,
|
||||||
|
@ -1500,10 +1539,17 @@ static int hostapd_setup_bss(struct hostapd_data *hapd, int first,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
#ifdef CONFIG_IEEE80211BE
|
||||||
|
struct hostapd_data *f_bss;
|
||||||
|
|
||||||
wpa_printf(MSG_DEBUG,
|
wpa_printf(MSG_DEBUG,
|
||||||
"MLD: Using RADIUS client of the first BSS");
|
"MLD: Using RADIUS client of the first BSS");
|
||||||
hapd->radius = hapd->mld_first_bss->radius;
|
f_bss = hostapd_mld_get_first_bss(hapd);
|
||||||
hapd->radius_das = hapd->mld_first_bss->radius_das;
|
if (!f_bss)
|
||||||
|
return -1;
|
||||||
|
hapd->radius = f_bss->radius;
|
||||||
|
hapd->radius_das = f_bss->radius_das;
|
||||||
|
#endif /* CONFIG_IEEE80211BE */
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_NO_RADIUS */
|
#endif /* CONFIG_NO_RADIUS */
|
||||||
|
|
||||||
|
@ -1741,6 +1787,7 @@ static int start_ctrl_iface(struct hostapd_iface *iface)
|
||||||
static void hostapd_no_ir_cleanup(struct hostapd_data *bss)
|
static void hostapd_no_ir_cleanup(struct hostapd_data *bss)
|
||||||
{
|
{
|
||||||
hostapd_bss_deinit_no_free(bss);
|
hostapd_bss_deinit_no_free(bss);
|
||||||
|
hostapd_bss_link_deinit(bss);
|
||||||
hostapd_free_hapd_data(bss);
|
hostapd_free_hapd_data(bss);
|
||||||
hostapd_cleanup_iface_partial(bss->iface);
|
hostapd_cleanup_iface_partial(bss->iface);
|
||||||
}
|
}
|
||||||
|
@ -2799,6 +2846,8 @@ static void hostapd_bss_deinit(struct hostapd_data *hapd)
|
||||||
hapd->rad_attr_db = NULL;
|
hapd->rad_attr_db = NULL;
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_SQLITE */
|
#endif /* CONFIG_SQLITE */
|
||||||
|
|
||||||
|
hostapd_bss_link_deinit(hapd);
|
||||||
hostapd_cleanup(hapd);
|
hostapd_cleanup(hapd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3142,7 +3191,7 @@ void hostapd_interface_deinit_free(struct hostapd_iface *iface)
|
||||||
wpa_printf(MSG_DEBUG, "%s: driver=%p drv_priv=%p -> hapd_deinit",
|
wpa_printf(MSG_DEBUG, "%s: driver=%p drv_priv=%p -> hapd_deinit",
|
||||||
__func__, driver, drv_priv);
|
__func__, driver, drv_priv);
|
||||||
if (driver && driver->hapd_deinit && drv_priv) {
|
if (driver && driver->hapd_deinit && drv_priv) {
|
||||||
if (!iface->bss[0]->mld_first_bss)
|
if (hostapd_mld_is_first_bss(iface->bss[0]))
|
||||||
driver->hapd_deinit(drv_priv);
|
driver->hapd_deinit(drv_priv);
|
||||||
hostapd_clear_drv_priv(iface->bss[0]);
|
hostapd_clear_drv_priv(iface->bss[0]);
|
||||||
}
|
}
|
||||||
|
@ -3159,7 +3208,7 @@ static void hostapd_deinit_driver(const struct wpa_driver_ops *driver,
|
||||||
wpa_printf(MSG_DEBUG, "%s: driver=%p drv_priv=%p -> hapd_deinit",
|
wpa_printf(MSG_DEBUG, "%s: driver=%p drv_priv=%p -> hapd_deinit",
|
||||||
__func__, driver, drv_priv);
|
__func__, driver, drv_priv);
|
||||||
if (driver && driver->hapd_deinit && drv_priv) {
|
if (driver && driver->hapd_deinit && drv_priv) {
|
||||||
if (!hapd_iface->bss[0]->mld_first_bss)
|
if (hostapd_mld_is_first_bss(hapd_iface->bss[0]))
|
||||||
driver->hapd_deinit(drv_priv);
|
driver->hapd_deinit(drv_priv);
|
||||||
for (j = 0; j < hapd_iface->num_bss; j++) {
|
for (j = 0; j < hapd_iface->num_bss; j++) {
|
||||||
wpa_printf(MSG_DEBUG, "%s:bss[%d]->drv_priv=%p",
|
wpa_printf(MSG_DEBUG, "%s:bss[%d]->drv_priv=%p",
|
||||||
|
@ -3273,7 +3322,7 @@ int hostapd_disable_iface(struct hostapd_iface *hapd_iface)
|
||||||
|
|
||||||
#ifdef CONFIG_IEEE80211BE
|
#ifdef CONFIG_IEEE80211BE
|
||||||
if (hapd_iface->bss[0]->conf->mld_ap &&
|
if (hapd_iface->bss[0]->conf->mld_ap &&
|
||||||
!hapd_iface->bss[0]->mld_first_bss) {
|
hostapd_mld_is_first_bss((hapd_iface->bss[0]))) {
|
||||||
/* Do not allow mld_first_bss disabling before other BSSs */
|
/* Do not allow mld_first_bss disabling before other BSSs */
|
||||||
for (j = 0; j < hapd_iface->interfaces->count; ++j) {
|
for (j = 0; j < hapd_iface->interfaces->count; ++j) {
|
||||||
struct hostapd_iface *h_iface =
|
struct hostapd_iface *h_iface =
|
||||||
|
@ -3311,6 +3360,7 @@ int hostapd_disable_iface(struct hostapd_iface *hapd_iface)
|
||||||
for (j = 0; j < hapd_iface->num_bss; j++) {
|
for (j = 0; j < hapd_iface->num_bss; j++) {
|
||||||
struct hostapd_data *hapd = hapd_iface->bss[j];
|
struct hostapd_data *hapd = hapd_iface->bss[j];
|
||||||
hostapd_bss_deinit_no_free(hapd);
|
hostapd_bss_deinit_no_free(hapd);
|
||||||
|
hostapd_bss_link_deinit(hapd);
|
||||||
hostapd_free_hapd_data(hapd);
|
hostapd_free_hapd_data(hapd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3506,6 +3556,7 @@ int hostapd_add_iface(struct hapd_interfaces *interfaces, char *buf)
|
||||||
if (start_ctrl_iface_bss(hapd) < 0 ||
|
if (start_ctrl_iface_bss(hapd) < 0 ||
|
||||||
(hapd_iface->state == HAPD_IFACE_ENABLED &&
|
(hapd_iface->state == HAPD_IFACE_ENABLED &&
|
||||||
hostapd_setup_bss(hapd, -1, true))) {
|
hostapd_setup_bss(hapd, -1, true))) {
|
||||||
|
hostapd_bss_link_deinit(hapd);
|
||||||
hostapd_cleanup(hapd);
|
hostapd_cleanup(hapd);
|
||||||
hapd_iface->bss[hapd_iface->num_bss - 1] = NULL;
|
hapd_iface->bss[hapd_iface->num_bss - 1] = NULL;
|
||||||
hapd_iface->conf->num_bss--;
|
hapd_iface->conf->num_bss--;
|
||||||
|
@ -3603,6 +3654,7 @@ fail:
|
||||||
wpa_printf(MSG_DEBUG, "%s: free hapd %p (%s)",
|
wpa_printf(MSG_DEBUG, "%s: free hapd %p (%s)",
|
||||||
__func__, hapd_iface->bss[i],
|
__func__, hapd_iface->bss[i],
|
||||||
hapd->conf->iface);
|
hapd->conf->iface);
|
||||||
|
hostapd_bss_link_deinit(hapd);
|
||||||
hostapd_cleanup(hapd);
|
hostapd_cleanup(hapd);
|
||||||
os_free(hapd);
|
os_free(hapd);
|
||||||
hapd_iface->bss[i] = NULL;
|
hapd_iface->bss[i] = NULL;
|
||||||
|
|
|
@ -180,12 +180,6 @@ struct hostapd_data {
|
||||||
unsigned int reenable_beacon:1;
|
unsigned int reenable_beacon:1;
|
||||||
|
|
||||||
u8 own_addr[ETH_ALEN];
|
u8 own_addr[ETH_ALEN];
|
||||||
u8 mld_addr[ETH_ALEN];
|
|
||||||
u8 mld_link_id;
|
|
||||||
/* Used for mld_link_id assignment - valid on the first MLD BSS only */
|
|
||||||
u8 mld_next_link_id;
|
|
||||||
|
|
||||||
struct hostapd_data *mld_first_bss;
|
|
||||||
|
|
||||||
int num_sta; /* number of entries in sta_list */
|
int num_sta; /* number of entries in sta_list */
|
||||||
struct sta_info *sta_list; /* STA info list head */
|
struct sta_info *sta_list; /* STA info list head */
|
||||||
|
@ -479,6 +473,7 @@ struct hostapd_data {
|
||||||
u8 eht_mld_bss_param_change;
|
u8 eht_mld_bss_param_change;
|
||||||
struct hostapd_mld *mld;
|
struct hostapd_mld *mld;
|
||||||
struct dl_list link;
|
struct dl_list link;
|
||||||
|
u8 mld_link_id;
|
||||||
#ifdef CONFIG_TESTING_OPTIONS
|
#ifdef CONFIG_TESTING_OPTIONS
|
||||||
u8 eht_mld_link_removal_count;
|
u8 eht_mld_link_removal_count;
|
||||||
#endif /* CONFIG_TESTING_OPTIONS */
|
#endif /* CONFIG_TESTING_OPTIONS */
|
||||||
|
|
|
@ -422,7 +422,7 @@ static int send_auth_reply(struct hostapd_data *hapd, struct sta_info *sta,
|
||||||
* the addresses.
|
* the addresses.
|
||||||
*/
|
*/
|
||||||
if (ap_sta_is_mld(hapd, sta)) {
|
if (ap_sta_is_mld(hapd, sta)) {
|
||||||
sa = hapd->mld_addr;
|
sa = hapd->mld->mld_addr;
|
||||||
|
|
||||||
ml_resp = hostapd_ml_auth_resp(hapd);
|
ml_resp = hostapd_ml_auth_resp(hapd);
|
||||||
if (!ml_resp)
|
if (!ml_resp)
|
||||||
|
@ -623,7 +623,7 @@ static struct wpabuf * auth_build_sae_commit(struct hostapd_data *hapd,
|
||||||
|
|
||||||
#ifdef CONFIG_IEEE80211BE
|
#ifdef CONFIG_IEEE80211BE
|
||||||
if (ap_sta_is_mld(hapd, sta))
|
if (ap_sta_is_mld(hapd, sta))
|
||||||
own_addr = hapd->mld_addr;
|
own_addr = hapd->mld->mld_addr;
|
||||||
#endif /* CONFIG_IEEE80211BE */
|
#endif /* CONFIG_IEEE80211BE */
|
||||||
|
|
||||||
if (sta->sae->tmp) {
|
if (sta->sae->tmp) {
|
||||||
|
@ -2819,7 +2819,9 @@ static void handle_auth(struct hostapd_data *hapd,
|
||||||
u16 seq_ctrl;
|
u16 seq_ctrl;
|
||||||
struct radius_sta rad_info;
|
struct radius_sta rad_info;
|
||||||
const u8 *dst, *sa, *bssid;
|
const u8 *dst, *sa, *bssid;
|
||||||
|
#ifdef CONFIG_IEEE80211BE
|
||||||
bool mld_sta = false;
|
bool mld_sta = false;
|
||||||
|
#endif /* CONFIG_IEEE80211BE */
|
||||||
|
|
||||||
if (len < IEEE80211_HDRLEN + sizeof(mgmt->u.auth)) {
|
if (len < IEEE80211_HDRLEN + sizeof(mgmt->u.auth)) {
|
||||||
wpa_printf(MSG_INFO, "handle_auth - too short payload (len=%lu)",
|
wpa_printf(MSG_INFO, "handle_auth - too short payload (len=%lu)",
|
||||||
|
@ -2937,15 +2939,17 @@ static void handle_auth(struct hostapd_data *hapd,
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_IEEE80211BE
|
||||||
if (mld_sta &&
|
if (mld_sta &&
|
||||||
(ether_addr_equal(sa, hapd->own_addr) ||
|
(ether_addr_equal(sa, hapd->own_addr) ||
|
||||||
ether_addr_equal(sa, hapd->mld_addr))) {
|
ether_addr_equal(sa, hapd->mld->mld_addr))) {
|
||||||
wpa_printf(MSG_INFO,
|
wpa_printf(MSG_INFO,
|
||||||
"Station " MACSTR " not allowed to authenticate",
|
"Station " MACSTR " not allowed to authenticate",
|
||||||
MAC2STR(sa));
|
MAC2STR(sa));
|
||||||
resp = WLAN_STATUS_UNSPECIFIED_FAILURE;
|
resp = WLAN_STATUS_UNSPECIFIED_FAILURE;
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
#endif /* CONFIG_IEEE80211BE */
|
||||||
|
|
||||||
if (hapd->conf->no_auth_if_seen_on) {
|
if (hapd->conf->no_auth_if_seen_on) {
|
||||||
struct hostapd_data *other;
|
struct hostapd_data *other;
|
||||||
|
@ -3268,7 +3272,7 @@ static void handle_auth(struct hostapd_data *hapd,
|
||||||
*/
|
*/
|
||||||
if (ap_sta_is_mld(hapd, sta)) {
|
if (ap_sta_is_mld(hapd, sta)) {
|
||||||
dst = sta->addr;
|
dst = sta->addr;
|
||||||
bssid = hapd->mld_addr;
|
bssid = hapd->mld->mld_addr;
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_IEEE80211BE */
|
#endif /* CONFIG_IEEE80211BE */
|
||||||
|
|
||||||
|
@ -3779,7 +3783,7 @@ u16 owe_process_rsn_ie(struct hostapd_data *hapd,
|
||||||
}
|
}
|
||||||
#ifdef CONFIG_IEEE80211BE
|
#ifdef CONFIG_IEEE80211BE
|
||||||
if (ap_sta_is_mld(hapd, sta))
|
if (ap_sta_is_mld(hapd, sta))
|
||||||
wpa_auth_set_ml_info(sta->wpa_sm, hapd->mld_addr,
|
wpa_auth_set_ml_info(sta->wpa_sm, hapd->mld->mld_addr,
|
||||||
sta->mld_assoc_link_id, &sta->mld_info);
|
sta->mld_assoc_link_id, &sta->mld_info);
|
||||||
#endif /* CONFIG_IEEE80211BE */
|
#endif /* CONFIG_IEEE80211BE */
|
||||||
rsn_ie -= 2;
|
rsn_ie -= 2;
|
||||||
|
@ -4064,7 +4068,7 @@ static int __check_assoc_ies(struct hostapd_data *hapd, struct sta_info *sta,
|
||||||
wpa_printf(MSG_DEBUG,
|
wpa_printf(MSG_DEBUG,
|
||||||
"MLD: Set ML info in RSN Authenticator");
|
"MLD: Set ML info in RSN Authenticator");
|
||||||
wpa_auth_set_ml_info(sta->wpa_sm,
|
wpa_auth_set_ml_info(sta->wpa_sm,
|
||||||
hapd->mld_addr,
|
hapd->mld->mld_addr,
|
||||||
sta->mld_assoc_link_id,
|
sta->mld_assoc_link_id,
|
||||||
info);
|
info);
|
||||||
}
|
}
|
||||||
|
@ -4825,7 +4829,7 @@ static u16 send_assoc_resp(struct hostapd_data *hapd, struct sta_info *sta,
|
||||||
* MLD MAC address.
|
* MLD MAC address.
|
||||||
*/
|
*/
|
||||||
if (ap_sta_is_mld(hapd, sta) && allow_mld_addr_trans)
|
if (ap_sta_is_mld(hapd, sta) && allow_mld_addr_trans)
|
||||||
sa = hapd->mld_addr;
|
sa = hapd->mld->mld_addr;
|
||||||
#endif /* CONFIG_IEEE80211BE */
|
#endif /* CONFIG_IEEE80211BE */
|
||||||
|
|
||||||
os_memcpy(reply->da, addr, ETH_ALEN);
|
os_memcpy(reply->da, addr, ETH_ALEN);
|
||||||
|
@ -6243,7 +6247,7 @@ int ieee802_11_mgmt(struct hostapd_data *hapd, const u8 *buf, size_t len,
|
||||||
#endif /* CONFIG_MESH */
|
#endif /* CONFIG_MESH */
|
||||||
#ifdef CONFIG_IEEE80211BE
|
#ifdef CONFIG_IEEE80211BE
|
||||||
!(hapd->conf->mld_ap &&
|
!(hapd->conf->mld_ap &&
|
||||||
ether_addr_equal(hapd->mld_addr, mgmt->bssid)) &&
|
ether_addr_equal(hapd->mld->mld_addr, mgmt->bssid)) &&
|
||||||
#endif /* CONFIG_IEEE80211BE */
|
#endif /* CONFIG_IEEE80211BE */
|
||||||
!ether_addr_equal(mgmt->bssid, hapd->own_addr)) {
|
!ether_addr_equal(mgmt->bssid, hapd->own_addr)) {
|
||||||
wpa_printf(MSG_INFO, "MGMT: BSSID=" MACSTR " not our address",
|
wpa_printf(MSG_INFO, "MGMT: BSSID=" MACSTR " not our address",
|
||||||
|
@ -6266,7 +6270,7 @@ int ieee802_11_mgmt(struct hostapd_data *hapd, const u8 *buf, size_t len,
|
||||||
stype != WLAN_FC_STYPE_ACTION) &&
|
stype != WLAN_FC_STYPE_ACTION) &&
|
||||||
#ifdef CONFIG_IEEE80211BE
|
#ifdef CONFIG_IEEE80211BE
|
||||||
!(hapd->conf->mld_ap &&
|
!(hapd->conf->mld_ap &&
|
||||||
ether_addr_equal(hapd->mld_addr, mgmt->bssid)) &&
|
ether_addr_equal(hapd->mld->mld_addr, mgmt->bssid)) &&
|
||||||
#endif /* CONFIG_IEEE80211BE */
|
#endif /* CONFIG_IEEE80211BE */
|
||||||
#ifdef CONFIG_NAN_USD
|
#ifdef CONFIG_NAN_USD
|
||||||
!ether_addr_equal(mgmt->da, nan_network_id) &&
|
!ether_addr_equal(mgmt->da, nan_network_id) &&
|
||||||
|
|
|
@ -487,7 +487,7 @@ static u8 * hostapd_eid_eht_basic_ml_common(struct hostapd_data *hapd,
|
||||||
wpabuf_put_u8(buf, common_info_len);
|
wpabuf_put_u8(buf, common_info_len);
|
||||||
|
|
||||||
/* Own MLD MAC Address */
|
/* Own MLD MAC Address */
|
||||||
wpabuf_put_data(buf, hapd->mld_addr, ETH_ALEN);
|
wpabuf_put_data(buf, hapd->mld->mld_addr, ETH_ALEN);
|
||||||
|
|
||||||
/* Own Link ID */
|
/* Own Link ID */
|
||||||
wpabuf_put_u8(buf, hapd->mld_link_id);
|
wpabuf_put_u8(buf, hapd->mld_link_id);
|
||||||
|
@ -804,7 +804,7 @@ struct wpabuf * hostapd_ml_auth_resp(struct hostapd_data *hapd)
|
||||||
wpabuf_put_u8(buf, WLAN_EID_EXT_MULTI_LINK);
|
wpabuf_put_u8(buf, WLAN_EID_EXT_MULTI_LINK);
|
||||||
wpabuf_put_le16(buf, MULTI_LINK_CONTROL_TYPE_BASIC);
|
wpabuf_put_le16(buf, MULTI_LINK_CONTROL_TYPE_BASIC);
|
||||||
wpabuf_put_u8(buf, ETH_ALEN + 1);
|
wpabuf_put_u8(buf, ETH_ALEN + 1);
|
||||||
wpabuf_put_data(buf, hapd->mld_addr, ETH_ALEN);
|
wpabuf_put_data(buf, hapd->mld->mld_addr, ETH_ALEN);
|
||||||
|
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
|
@ -121,7 +121,7 @@ void ieee802_11_send_sa_query_req(struct hostapd_data *hapd,
|
||||||
|
|
||||||
#ifdef CONFIG_IEEE80211BE
|
#ifdef CONFIG_IEEE80211BE
|
||||||
if (ap_sta_is_mld(hapd, sta))
|
if (ap_sta_is_mld(hapd, sta))
|
||||||
own_addr = hapd->mld_addr;
|
own_addr = hapd->mld->mld_addr;
|
||||||
#endif /* CONFIG_IEEE80211BE */
|
#endif /* CONFIG_IEEE80211BE */
|
||||||
|
|
||||||
mgmt->frame_control = IEEE80211_FC(WLAN_FC_TYPE_MGMT,
|
mgmt->frame_control = IEEE80211_FC(WLAN_FC_TYPE_MGMT,
|
||||||
|
@ -219,7 +219,7 @@ static void ieee802_11_send_sa_query_resp(struct hostapd_data *hapd,
|
||||||
|
|
||||||
#ifdef CONFIG_IEEE80211BE
|
#ifdef CONFIG_IEEE80211BE
|
||||||
if (ap_sta_is_mld(hapd, sta))
|
if (ap_sta_is_mld(hapd, sta))
|
||||||
own_addr = hapd->mld_addr;
|
own_addr = hapd->mld->mld_addr;
|
||||||
#endif /* CONFIG_IEEE80211BE */
|
#endif /* CONFIG_IEEE80211BE */
|
||||||
|
|
||||||
resp->frame_control = IEEE80211_FC(WLAN_FC_TYPE_MGMT,
|
resp->frame_control = IEEE80211_FC(WLAN_FC_TYPE_MGMT,
|
||||||
|
|
|
@ -2539,13 +2539,20 @@ int ieee802_1x_init(struct hostapd_data *hapd)
|
||||||
struct eapol_auth_config conf;
|
struct eapol_auth_config conf;
|
||||||
struct eapol_auth_cb cb;
|
struct eapol_auth_cb cb;
|
||||||
|
|
||||||
if (hapd->mld_first_bss) {
|
#ifdef CONFIG_IEEE80211BE
|
||||||
|
if (!hostapd_mld_is_first_bss(hapd)) {
|
||||||
|
struct hostapd_data *first;
|
||||||
|
|
||||||
wpa_printf(MSG_DEBUG,
|
wpa_printf(MSG_DEBUG,
|
||||||
"MLD: Using IEEE 802.1X state machine of the first BSS");
|
"MLD: Using IEEE 802.1X state machine of the first BSS");
|
||||||
|
|
||||||
hapd->eapol_auth = hapd->mld_first_bss->eapol_auth;
|
first = hostapd_mld_get_first_bss(hapd);
|
||||||
|
if (!first)
|
||||||
|
return -1;
|
||||||
|
hapd->eapol_auth = first->eapol_auth;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
#endif /* CONFIG_IEEE80211BE */
|
||||||
|
|
||||||
dl_list_init(&hapd->erp_keys);
|
dl_list_init(&hapd->erp_keys);
|
||||||
|
|
||||||
|
@ -2631,13 +2638,15 @@ void ieee802_1x_erp_flush(struct hostapd_data *hapd)
|
||||||
|
|
||||||
void ieee802_1x_deinit(struct hostapd_data *hapd)
|
void ieee802_1x_deinit(struct hostapd_data *hapd)
|
||||||
{
|
{
|
||||||
if (hapd->mld_first_bss) {
|
#ifdef CONFIG_IEEE80211BE
|
||||||
|
if (!hostapd_mld_is_first_bss(hapd)) {
|
||||||
wpa_printf(MSG_DEBUG,
|
wpa_printf(MSG_DEBUG,
|
||||||
"MLD: Deinit IEEE 802.1X state machine of a non-first BSS");
|
"MLD: Deinit IEEE 802.1X state machine of a non-first BSS");
|
||||||
|
|
||||||
hapd->eapol_auth = NULL;
|
hapd->eapol_auth = NULL;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
#endif /* CONFIG_IEEE80211BE */
|
||||||
|
|
||||||
#ifdef CONFIG_WEP
|
#ifdef CONFIG_WEP
|
||||||
eloop_cancel_timeout(ieee802_1x_rekey, hapd, NULL);
|
eloop_cancel_timeout(ieee802_1x_rekey, hapd, NULL);
|
||||||
|
|
|
@ -51,7 +51,7 @@ static const u8 * wnm_ap_get_own_addr(struct hostapd_data *hapd,
|
||||||
|
|
||||||
#ifdef CONFIG_IEEE80211BE
|
#ifdef CONFIG_IEEE80211BE
|
||||||
if (hapd->conf->mld_ap && (!sta || ap_sta_is_mld(hapd, sta)))
|
if (hapd->conf->mld_ap && (!sta || ap_sta_is_mld(hapd, sta)))
|
||||||
own_addr = hapd->mld_addr;
|
own_addr = hapd->mld->mld_addr;
|
||||||
#endif /* CONFIG_IEEE80211BE */
|
#endif /* CONFIG_IEEE80211BE */
|
||||||
|
|
||||||
return own_addr;
|
return own_addr;
|
||||||
|
|
Loading…
Reference in a new issue