AP MLD: Use a helper function to check if a STA is a non-AP MLD
This makes it easier to change the struct sta_info design for MLD by reducing the number of direct references. Signed-off-by: Jouni Malinen <j@w1.fi>
This commit is contained in:
parent
ee9375fb3b
commit
6bda0aca8b
10 changed files with 41 additions and 29 deletions
|
@ -269,7 +269,7 @@ static bool hostapd_sta_is_link_sta(struct hostapd_data *hapd,
|
||||||
struct sta_info *sta)
|
struct sta_info *sta)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_IEEE80211BE
|
#ifdef CONFIG_IEEE80211BE
|
||||||
if (hapd->conf->mld_ap && sta->mld_info.mld_sta &&
|
if (ap_sta_is_mld(hapd, sta) &&
|
||||||
sta->mld_assoc_link_id != hapd->mld_link_id)
|
sta->mld_assoc_link_id != hapd->mld_link_id)
|
||||||
return true;
|
return true;
|
||||||
#endif /* CONFIG_IEEE80211BE */
|
#endif /* CONFIG_IEEE80211BE */
|
||||||
|
@ -839,7 +839,7 @@ int hostapd_drv_sta_deauth(struct hostapd_data *hapd,
|
||||||
struct sta_info *sta = ap_get_sta(hapd, addr);
|
struct sta_info *sta = ap_get_sta(hapd, addr);
|
||||||
|
|
||||||
link_id = hapd->mld_link_id;
|
link_id = hapd->mld_link_id;
|
||||||
if (sta && sta->mld_info.mld_sta)
|
if (ap_sta_is_mld(hapd, sta))
|
||||||
own_addr = hapd->mld_addr;
|
own_addr = hapd->mld_addr;
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_IEEE80211BE */
|
#endif /* CONFIG_IEEE80211BE */
|
||||||
|
@ -860,7 +860,7 @@ int hostapd_drv_sta_disassoc(struct hostapd_data *hapd,
|
||||||
if (hapd->conf->mld_ap) {
|
if (hapd->conf->mld_ap) {
|
||||||
struct sta_info *sta = ap_get_sta(hapd, addr);
|
struct sta_info *sta = ap_get_sta(hapd, addr);
|
||||||
|
|
||||||
if (sta && sta->mld_info.mld_sta)
|
if (ap_sta_is_mld(hapd, sta))
|
||||||
own_addr = hapd->mld_addr;
|
own_addr = hapd->mld_addr;
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_IEEE80211BE */
|
#endif /* CONFIG_IEEE80211BE */
|
||||||
|
@ -918,7 +918,7 @@ static int hapd_drv_send_action(struct hostapd_data *hapd, unsigned int freq,
|
||||||
} else if (hapd->conf->mld_ap) {
|
} else if (hapd->conf->mld_ap) {
|
||||||
sta = ap_get_sta(hapd, dst);
|
sta = ap_get_sta(hapd, dst);
|
||||||
|
|
||||||
if (sta && sta->mld_info.mld_sta) {
|
if (ap_sta_is_mld(hapd, sta)) {
|
||||||
own_addr = hapd->mld_addr;
|
own_addr = hapd->mld_addr;
|
||||||
bssid = own_addr;
|
bssid = own_addr;
|
||||||
}
|
}
|
||||||
|
|
|
@ -513,7 +513,7 @@ int hostapd_notif_assoc(struct hostapd_data *hapd, const u8 *addr,
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
#ifdef CONFIG_IEEE80211BE
|
#ifdef CONFIG_IEEE80211BE
|
||||||
if (sta->mld_info.mld_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_addr,
|
||||||
|
|
|
@ -3599,7 +3599,7 @@ void hostapd_new_assoc_sta(struct hostapd_data *hapd, struct sta_info *sta,
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_IEEE80211BE
|
#ifdef CONFIG_IEEE80211BE
|
||||||
if (hapd->conf->mld_ap && sta->mld_info.mld_sta &&
|
if (ap_sta_is_mld(hapd, sta) &&
|
||||||
sta->mld_assoc_link_id != hapd->mld_link_id)
|
sta->mld_assoc_link_id != hapd->mld_link_id)
|
||||||
return;
|
return;
|
||||||
#endif /* CONFIG_IEEE80211BE */
|
#endif /* CONFIG_IEEE80211BE */
|
||||||
|
|
|
@ -407,7 +407,7 @@ static int send_auth_reply(struct hostapd_data *hapd, struct sta_info *sta,
|
||||||
* the MLD MAC address. Thus, use the MLD address instead of translating
|
* the MLD MAC address. Thus, use the MLD address instead of translating
|
||||||
* the addresses.
|
* the addresses.
|
||||||
*/
|
*/
|
||||||
if (hapd->conf->mld_ap && sta && sta->mld_info.mld_sta) {
|
if (ap_sta_is_mld(hapd, sta)) {
|
||||||
sa = hapd->mld_addr;
|
sa = hapd->mld_addr;
|
||||||
|
|
||||||
ml_resp = hostapd_ml_auth_resp(hapd);
|
ml_resp = hostapd_ml_auth_resp(hapd);
|
||||||
|
@ -608,7 +608,7 @@ static struct wpabuf * auth_build_sae_commit(struct hostapd_data *hapd,
|
||||||
const u8 *own_addr = hapd->own_addr;
|
const u8 *own_addr = hapd->own_addr;
|
||||||
|
|
||||||
#ifdef CONFIG_IEEE80211BE
|
#ifdef CONFIG_IEEE80211BE
|
||||||
if (hapd->conf->mld_ap && sta->mld_info.mld_sta)
|
if (ap_sta_is_mld(hapd, sta))
|
||||||
own_addr = hapd->mld_addr;
|
own_addr = hapd->mld_addr;
|
||||||
#endif /* CONFIG_IEEE80211BE */
|
#endif /* CONFIG_IEEE80211BE */
|
||||||
|
|
||||||
|
@ -877,7 +877,7 @@ static void sae_sme_send_external_auth_status(struct hostapd_data *hapd,
|
||||||
params.status = status;
|
params.status = status;
|
||||||
|
|
||||||
#ifdef CONFIG_IEEE80211BE
|
#ifdef CONFIG_IEEE80211BE
|
||||||
if (sta->mld_info.mld_sta)
|
if (ap_sta_is_mld(hapd, sta))
|
||||||
params.bssid =
|
params.bssid =
|
||||||
sta->mld_info.links[sta->mld_assoc_link_id].peer_addr;
|
sta->mld_info.links[sta->mld_assoc_link_id].peer_addr;
|
||||||
#endif /* CONFIG_IEEE80211BE */
|
#endif /* CONFIG_IEEE80211BE */
|
||||||
|
@ -3246,7 +3246,7 @@ static void handle_auth(struct hostapd_data *hapd,
|
||||||
* the MLD MAC address. It is the responsibility of the driver to
|
* the MLD MAC address. It is the responsibility of the driver to
|
||||||
* handle the translations.
|
* handle the translations.
|
||||||
*/
|
*/
|
||||||
if (hapd->conf->mld_ap && sta && sta->mld_info.mld_sta) {
|
if (ap_sta_is_mld(hapd, sta)) {
|
||||||
dst = sta->addr;
|
dst = sta->addr;
|
||||||
bssid = hapd->mld_addr;
|
bssid = hapd->mld_addr;
|
||||||
}
|
}
|
||||||
|
@ -3737,7 +3737,7 @@ u16 owe_process_rsn_ie(struct hostapd_data *hapd,
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
#ifdef CONFIG_IEEE80211BE
|
#ifdef CONFIG_IEEE80211BE
|
||||||
if (sta->mld_info.mld_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_addr,
|
||||||
sta->mld_assoc_link_id, &sta->mld_info);
|
sta->mld_assoc_link_id, &sta->mld_info);
|
||||||
#endif /* CONFIG_IEEE80211BE */
|
#endif /* CONFIG_IEEE80211BE */
|
||||||
|
@ -4019,7 +4019,7 @@ static int __check_assoc_ies(struct hostapd_data *hapd, struct sta_info *sta,
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_IEEE80211BE
|
#ifdef CONFIG_IEEE80211BE
|
||||||
if (info->mld_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,
|
wpa_auth_set_ml_info(sta->wpa_sm,
|
||||||
|
@ -4608,7 +4608,7 @@ static int add_associated_sta(struct hostapd_data *hapd,
|
||||||
bool mld_link_sta = false;
|
bool mld_link_sta = false;
|
||||||
|
|
||||||
#ifdef CONFIG_IEEE80211BE
|
#ifdef CONFIG_IEEE80211BE
|
||||||
if (hapd->conf->mld_ap && sta->mld_info.mld_sta) {
|
if (ap_sta_is_mld(hapd, sta)) {
|
||||||
u8 mld_link_id = hapd->mld_link_id;
|
u8 mld_link_id = hapd->mld_link_id;
|
||||||
|
|
||||||
mld_link_sta = sta->mld_assoc_link_id != mld_link_id;
|
mld_link_sta = sta->mld_assoc_link_id != mld_link_id;
|
||||||
|
@ -4769,8 +4769,7 @@ static u16 send_assoc_resp(struct hostapd_data *hapd, struct sta_info *sta,
|
||||||
* Once a non-AP MLD is added to the driver, the addressing should use
|
* Once a non-AP MLD is added to the driver, the addressing should use
|
||||||
* MLD MAC address.
|
* MLD MAC address.
|
||||||
*/
|
*/
|
||||||
if (hapd->conf->mld_ap && sta && sta->mld_info.mld_sta &&
|
if (ap_sta_is_mld(hapd, sta) && allow_mld_addr_trans)
|
||||||
allow_mld_addr_trans)
|
|
||||||
sa = hapd->mld_addr;
|
sa = hapd->mld_addr;
|
||||||
#endif /* CONFIG_IEEE80211BE */
|
#endif /* CONFIG_IEEE80211BE */
|
||||||
|
|
||||||
|
@ -6440,7 +6439,7 @@ static void handle_assoc_cb(struct hostapd_data *hapd,
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_IEEE80211BE
|
#ifdef CONFIG_IEEE80211BE
|
||||||
if (hapd->conf->mld_ap && sta->mld_info.mld_sta &&
|
if (ap_sta_is_mld(hapd, sta) &&
|
||||||
hapd->mld_link_id != sta->mld_assoc_link_id) {
|
hapd->mld_link_id != sta->mld_assoc_link_id) {
|
||||||
/* See ieee80211_ml_link_sta_assoc_cb() for the MLD case */
|
/* See ieee80211_ml_link_sta_assoc_cb() for the MLD case */
|
||||||
wpa_printf(MSG_DEBUG,
|
wpa_printf(MSG_DEBUG,
|
||||||
|
|
|
@ -779,7 +779,7 @@ u8 * hostapd_eid_eht_ml_beacon(struct hostapd_data *hapd,
|
||||||
u8 * hostapd_eid_eht_ml_assoc(struct hostapd_data *hapd, struct sta_info *info,
|
u8 * hostapd_eid_eht_ml_assoc(struct hostapd_data *hapd, struct sta_info *info,
|
||||||
u8 *eid)
|
u8 *eid)
|
||||||
{
|
{
|
||||||
if (!info || !info->mld_info.mld_sta)
|
if (!ap_sta_is_mld(hapd, info))
|
||||||
return eid;
|
return eid;
|
||||||
|
|
||||||
eid = hostapd_eid_eht_basic_ml_common(hapd, eid, &info->mld_info,
|
eid = hostapd_eid_eht_basic_ml_common(hapd, eid, &info->mld_info,
|
||||||
|
@ -1012,11 +1012,12 @@ const u8 * hostapd_process_ml_auth(struct hostapd_data *hapd,
|
||||||
|
|
||||||
|
|
||||||
static int hostapd_mld_validate_assoc_info(struct hostapd_data *hapd,
|
static int hostapd_mld_validate_assoc_info(struct hostapd_data *hapd,
|
||||||
struct mld_info *info)
|
struct sta_info *sta)
|
||||||
{
|
{
|
||||||
u8 i, link_id;
|
u8 i, link_id;
|
||||||
|
struct mld_info *info = &sta->mld_info;
|
||||||
|
|
||||||
if (!info->mld_sta) {
|
if (!ap_sta_is_mld(hapd, sta)) {
|
||||||
wpa_printf(MSG_DEBUG, "MLD: Not a non-AP MLD");
|
wpa_printf(MSG_DEBUG, "MLD: Not a non-AP MLD");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1390,7 +1391,7 @@ u16 hostapd_process_ml_assoc_req(struct hostapd_data *hapd,
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = hostapd_mld_validate_assoc_info(hapd, info);
|
ret = hostapd_mld_validate_assoc_info(hapd, sta);
|
||||||
out:
|
out:
|
||||||
wpabuf_free(mlbuf);
|
wpabuf_free(mlbuf);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
|
|
|
@ -120,7 +120,7 @@ void ieee802_11_send_sa_query_req(struct hostapd_data *hapd,
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_IEEE80211BE
|
#ifdef CONFIG_IEEE80211BE
|
||||||
if (hapd->conf->mld_ap && sta && sta->mld_info.mld_sta)
|
if (ap_sta_is_mld(hapd, sta))
|
||||||
own_addr = hapd->mld_addr;
|
own_addr = hapd->mld_addr;
|
||||||
#endif /* CONFIG_IEEE80211BE */
|
#endif /* CONFIG_IEEE80211BE */
|
||||||
|
|
||||||
|
@ -218,7 +218,7 @@ static void ieee802_11_send_sa_query_resp(struct hostapd_data *hapd,
|
||||||
MACSTR, MAC2STR(sa));
|
MACSTR, MAC2STR(sa));
|
||||||
|
|
||||||
#ifdef CONFIG_IEEE80211BE
|
#ifdef CONFIG_IEEE80211BE
|
||||||
if (hapd->conf->mld_ap && sta->mld_info.mld_sta)
|
if (ap_sta_is_mld(hapd, sta))
|
||||||
own_addr = hapd->mld_addr;
|
own_addr = hapd->mld_addr;
|
||||||
#endif /* CONFIG_IEEE80211BE */
|
#endif /* CONFIG_IEEE80211BE */
|
||||||
|
|
||||||
|
@ -1169,7 +1169,7 @@ struct sta_info * hostapd_ml_get_assoc_sta(struct hostapd_data *hapd,
|
||||||
struct hostapd_data *other_hapd = NULL;
|
struct hostapd_data *other_hapd = NULL;
|
||||||
struct sta_info *tmp_sta;
|
struct sta_info *tmp_sta;
|
||||||
|
|
||||||
if (!sta->mld_info.mld_sta)
|
if (!ap_sta_is_mld(hapd, sta))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
*assoc_hapd = hapd;
|
*assoc_hapd = hapd;
|
||||||
|
|
|
@ -303,7 +303,7 @@ void ap_free_sta(struct hostapd_data *hapd, struct sta_info *sta)
|
||||||
ieee802_1x_free_station(hapd, sta);
|
ieee802_1x_free_station(hapd, sta);
|
||||||
|
|
||||||
#ifdef CONFIG_IEEE80211BE
|
#ifdef CONFIG_IEEE80211BE
|
||||||
if (!hapd->conf->mld_ap || !sta->mld_info.mld_sta ||
|
if (!ap_sta_is_mld(hapd, sta) ||
|
||||||
hapd->mld_link_id == sta->mld_assoc_link_id)
|
hapd->mld_link_id == sta->mld_assoc_link_id)
|
||||||
wpa_auth_sta_deinit(sta->wpa_sm);
|
wpa_auth_sta_deinit(sta->wpa_sm);
|
||||||
#else
|
#else
|
||||||
|
@ -1400,7 +1400,7 @@ bool ap_sta_set_authorized_flag(struct hostapd_data *hapd, struct sta_info *sta,
|
||||||
int mld_assoc_link_id = -1;
|
int mld_assoc_link_id = -1;
|
||||||
|
|
||||||
#ifdef CONFIG_IEEE80211BE
|
#ifdef CONFIG_IEEE80211BE
|
||||||
if (hapd->conf->mld_ap && sta->mld_info.mld_sta) {
|
if (ap_sta_is_mld(hapd, sta)) {
|
||||||
if (sta->mld_assoc_link_id == hapd->mld_link_id)
|
if (sta->mld_assoc_link_id == hapd->mld_link_id)
|
||||||
mld_assoc_link_id = sta->mld_assoc_link_id;
|
mld_assoc_link_id = sta->mld_assoc_link_id;
|
||||||
else
|
else
|
||||||
|
@ -1757,7 +1757,7 @@ int ap_sta_re_add(struct hostapd_data *hapd, struct sta_info *sta)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef CONFIG_IEEE80211BE
|
#ifdef CONFIG_IEEE80211BE
|
||||||
if (hapd->conf->mld_ap && sta->mld_info.mld_sta) {
|
if (ap_sta_is_mld(hapd, sta)) {
|
||||||
u8 mld_link_id = hapd->mld_link_id;
|
u8 mld_link_id = hapd->mld_link_id;
|
||||||
|
|
||||||
mld_link_sta = sta->mld_assoc_link_id != mld_link_id;
|
mld_link_sta = sta->mld_assoc_link_id != mld_link_id;
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
#include "common/sae.h"
|
#include "common/sae.h"
|
||||||
#include "crypto/sha384.h"
|
#include "crypto/sha384.h"
|
||||||
#include "pasn/pasn_common.h"
|
#include "pasn/pasn_common.h"
|
||||||
|
#include "hostapd.h"
|
||||||
|
|
||||||
/* STA flags */
|
/* STA flags */
|
||||||
#define WLAN_STA_AUTH BIT(0)
|
#define WLAN_STA_AUTH BIT(0)
|
||||||
|
@ -419,4 +420,14 @@ int ap_sta_re_add(struct hostapd_data *hapd, struct sta_info *sta);
|
||||||
|
|
||||||
void ap_free_sta_pasn(struct hostapd_data *hapd, struct sta_info *sta);
|
void ap_free_sta_pasn(struct hostapd_data *hapd, struct sta_info *sta);
|
||||||
|
|
||||||
|
static inline bool ap_sta_is_mld(struct hostapd_data *hapd,
|
||||||
|
struct sta_info *sta)
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_IEEE80211BE
|
||||||
|
return hapd->conf->mld_ap && sta && sta->mld_info.mld_sta;
|
||||||
|
#else /* CONFIG_IEEE80211BE */
|
||||||
|
return false;
|
||||||
|
#endif /* CONFIG_IEEE80211BE */
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* STA_INFO_H */
|
#endif /* STA_INFO_H */
|
||||||
|
|
|
@ -50,7 +50,7 @@ static const u8 * wnm_ap_get_own_addr(struct hostapd_data *hapd,
|
||||||
const u8 *own_addr = hapd->own_addr;
|
const u8 *own_addr = hapd->own_addr;
|
||||||
|
|
||||||
#ifdef CONFIG_IEEE80211BE
|
#ifdef CONFIG_IEEE80211BE
|
||||||
if (hapd->conf->mld_ap && (!sta || sta->mld_info.mld_sta))
|
if (hapd->conf->mld_ap && (!sta || ap_sta_is_mld(hapd, sta)))
|
||||||
own_addr = hapd->mld_addr;
|
own_addr = hapd->mld_addr;
|
||||||
#endif /* CONFIG_IEEE80211BE */
|
#endif /* CONFIG_IEEE80211BE */
|
||||||
|
|
||||||
|
@ -1030,7 +1030,7 @@ int wnm_send_bss_tm_req(struct hostapd_data *hapd, struct sta_info *sta,
|
||||||
|
|
||||||
if (disassoc_timer) {
|
if (disassoc_timer) {
|
||||||
#ifdef CONFIG_IEEE80211BE
|
#ifdef CONFIG_IEEE80211BE
|
||||||
if (hapd->conf->mld_ap && sta->mld_info.mld_sta) {
|
if (ap_sta_is_mld(hapd, sta)) {
|
||||||
int i;
|
int i;
|
||||||
unsigned int links = 0;
|
unsigned int links = 0;
|
||||||
|
|
||||||
|
|
|
@ -560,7 +560,8 @@ int hostapd_wpa_auth_send_eapol(void *ctx, const u8 *addr,
|
||||||
if (sta) {
|
if (sta) {
|
||||||
flags = hostapd_sta_flags_to_drv(sta->flags);
|
flags = hostapd_sta_flags_to_drv(sta->flags);
|
||||||
#ifdef CONFIG_IEEE80211BE
|
#ifdef CONFIG_IEEE80211BE
|
||||||
if (sta->mld_info.mld_sta && (sta->flags & WLAN_STA_AUTHORIZED))
|
if (ap_sta_is_mld(hapd, sta) &&
|
||||||
|
(sta->flags & WLAN_STA_AUTHORIZED))
|
||||||
link_id = -1;
|
link_id = -1;
|
||||||
#endif /* CONFIG_IEEE80211BE */
|
#endif /* CONFIG_IEEE80211BE */
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue