From: Ilan Peer <ilan.peer@xxxxxxxxx> When the AP is configured to operate as AP MLD, use the AP MLD address when needed for transmission of WNM action frames. Signed-off-by: Ilan Peer <ilan.peer@xxxxxxxxx> --- src/ap/wnm_ap.c | 44 ++++++++++++++++++++++++++++++++------------ 1 file changed, 32 insertions(+), 12 deletions(-) diff --git a/src/ap/wnm_ap.c b/src/ap/wnm_ap.c index 153ee40334..06906dead9 100644 --- a/src/ap/wnm_ap.c +++ b/src/ap/wnm_ap.c @@ -43,6 +43,17 @@ static int ieee80211_11_set_tfs_ie(struct hostapd_data *hapd, const u8 *addr, return hostapd_drv_wnm_oper(hapd, oper, addr, buf, buf_len); } +const u8 *wnm_ap_get_own_addr(struct hostapd_data *hapd, struct sta_info *sta) +{ + const u8 *own_addr = hapd->own_addr; + +#ifdef CONFIG_IEEE80211BE + if (hapd->conf->mld_ap && (!sta || sta->mld_info.mld_sta)) + own_addr = hapd->mld_addr; +#endif /* CONFIG_IEEE80211BE */ + + return own_addr; +} /* MLME-SLEEPMODE.response */ static int ieee802_11_send_wnmsleep_resp(struct hostapd_data *hapd, @@ -63,6 +74,7 @@ static int ieee802_11_send_wnmsleep_resp(struct hostapd_data *hapd, struct sta_info *sta; enum wnm_oper tfs_oper = action_type == WNM_SLEEP_MODE_ENTER ? WNM_SLEEP_TFS_RESP_IE_ADD : WNM_SLEEP_TFS_RESP_IE_NONE; + const u8 *own_addr; sta = ap_get_sta(hapd, addr); if (sta == NULL) { @@ -70,6 +82,8 @@ static int ieee802_11_send_wnmsleep_resp(struct hostapd_data *hapd, return -EINVAL; } + own_addr = wnm_ap_get_own_addr(hapd, sta); + /* WNM-Sleep Mode IE */ os_memset(&wnmsleep_ie, 0, sizeof(struct wnm_sleep_element)); wnmsleep_ie_len = sizeof(struct wnm_sleep_element); @@ -144,8 +158,8 @@ static int ieee802_11_send_wnmsleep_resp(struct hostapd_data *hapd, goto fail; } os_memcpy(mgmt->da, addr, ETH_ALEN); - os_memcpy(mgmt->sa, hapd->own_addr, ETH_ALEN); - os_memcpy(mgmt->bssid, hapd->own_addr, ETH_ALEN); + os_memcpy(mgmt->sa, own_addr, ETH_ALEN); + os_memcpy(mgmt->bssid, own_addr, ETH_ALEN); mgmt->frame_control = IEEE80211_FC(WLAN_FC_TYPE_MGMT, WLAN_FC_STYPE_ACTION); mgmt->u.action.category = WLAN_ACTION_WNM; @@ -366,6 +380,7 @@ static int ieee802_11_send_bss_trans_mgmt_request(struct hostapd_data *hapd, u8 dialog_token) { struct ieee80211_mgmt *mgmt; + const u8 *own_addr = wnm_ap_get_own_addr(hapd, NULL); size_t len; u8 *pos; int res; @@ -373,9 +388,10 @@ static int ieee802_11_send_bss_trans_mgmt_request(struct hostapd_data *hapd, mgmt = os_zalloc(sizeof(*mgmt)); if (mgmt == NULL) return -1; + os_memcpy(mgmt->da, addr, ETH_ALEN); - os_memcpy(mgmt->sa, hapd->own_addr, ETH_ALEN); - os_memcpy(mgmt->bssid, hapd->own_addr, ETH_ALEN); + os_memcpy(mgmt->sa, own_addr, ETH_ALEN); + os_memcpy(mgmt->bssid, own_addr, ETH_ALEN); mgmt->frame_control = IEEE80211_FC(WLAN_FC_TYPE_MGMT, WLAN_FC_STYPE_ACTION); mgmt->u.action.category = WLAN_ACTION_WNM; @@ -821,14 +837,15 @@ int wnm_send_disassoc_imminent(struct hostapd_data *hapd, { u8 buf[1000], *pos; struct ieee80211_mgmt *mgmt; + const u8 *own_addr = wnm_ap_get_own_addr(hapd, sta); os_memset(buf, 0, sizeof(buf)); mgmt = (struct ieee80211_mgmt *) buf; mgmt->frame_control = IEEE80211_FC(WLAN_FC_TYPE_MGMT, WLAN_FC_STYPE_ACTION); os_memcpy(mgmt->da, sta->addr, ETH_ALEN); - os_memcpy(mgmt->sa, hapd->own_addr, ETH_ALEN); - os_memcpy(mgmt->bssid, hapd->own_addr, ETH_ALEN); + os_memcpy(mgmt->sa, own_addr, ETH_ALEN); + os_memcpy(mgmt->bssid, own_addr, ETH_ALEN); mgmt->u.action.category = WLAN_ACTION_WNM; mgmt->u.action.u.bss_tm_req.action = WNM_BSS_TRANS_MGMT_REQ; mgmt->u.action.u.bss_tm_req.dialog_token = 1; @@ -887,14 +904,15 @@ int wnm_send_ess_disassoc_imminent(struct hostapd_data *hapd, u8 buf[1000], *pos; struct ieee80211_mgmt *mgmt; size_t url_len; + const u8 *own_addr = wnm_ap_get_own_addr(hapd, sta); os_memset(buf, 0, sizeof(buf)); mgmt = (struct ieee80211_mgmt *) buf; mgmt->frame_control = IEEE80211_FC(WLAN_FC_TYPE_MGMT, WLAN_FC_STYPE_ACTION); os_memcpy(mgmt->da, sta->addr, ETH_ALEN); - os_memcpy(mgmt->sa, hapd->own_addr, ETH_ALEN); - os_memcpy(mgmt->bssid, hapd->own_addr, ETH_ALEN); + os_memcpy(mgmt->sa, own_addr, ETH_ALEN); + os_memcpy(mgmt->bssid, own_addr, ETH_ALEN); mgmt->u.action.category = WLAN_ACTION_WNM; mgmt->u.action.u.bss_tm_req.action = WNM_BSS_TRANS_MGMT_REQ; mgmt->u.action.u.bss_tm_req.dialog_token = 1; @@ -939,6 +957,7 @@ int wnm_send_bss_tm_req(struct hostapd_data *hapd, struct sta_info *sta, u8 *buf, *pos; struct ieee80211_mgmt *mgmt; size_t url_len; + const u8 *own_addr = wnm_ap_get_own_addr(hapd, sta); wpa_printf(MSG_DEBUG, "WNM: Send BSS Transition Management Request to " MACSTR @@ -952,8 +971,8 @@ int wnm_send_bss_tm_req(struct hostapd_data *hapd, struct sta_info *sta, mgmt->frame_control = IEEE80211_FC(WLAN_FC_TYPE_MGMT, WLAN_FC_STYPE_ACTION); os_memcpy(mgmt->da, sta->addr, ETH_ALEN); - os_memcpy(mgmt->sa, hapd->own_addr, ETH_ALEN); - os_memcpy(mgmt->bssid, hapd->own_addr, ETH_ALEN); + os_memcpy(mgmt->sa, own_addr, ETH_ALEN); + os_memcpy(mgmt->bssid, own_addr, ETH_ALEN); mgmt->u.action.category = WLAN_ACTION_WNM; mgmt->u.action.u.bss_tm_req.action = WNM_BSS_TRANS_MGMT_REQ; mgmt->u.action.u.bss_tm_req.dialog_token = dialog_token; @@ -1016,6 +1035,7 @@ int wnm_send_coloc_intf_req(struct hostapd_data *hapd, struct sta_info *sta, u8 buf[100], *pos; struct ieee80211_mgmt *mgmt; u8 dialog_token = 1; + const u8 *own_addr = wnm_ap_get_own_addr(hapd, sta); if (auto_report > 3 || timeout > 63) return -1; @@ -1024,8 +1044,8 @@ int wnm_send_coloc_intf_req(struct hostapd_data *hapd, struct sta_info *sta, mgmt->frame_control = IEEE80211_FC(WLAN_FC_TYPE_MGMT, WLAN_FC_STYPE_ACTION); os_memcpy(mgmt->da, sta->addr, ETH_ALEN); - os_memcpy(mgmt->sa, hapd->own_addr, ETH_ALEN); - os_memcpy(mgmt->bssid, hapd->own_addr, ETH_ALEN); + os_memcpy(mgmt->sa, own_addr, ETH_ALEN); + os_memcpy(mgmt->bssid, own_addr, ETH_ALEN); mgmt->u.action.category = WLAN_ACTION_WNM; mgmt->u.action.u.coloc_intf_req.action = WNM_COLLOCATED_INTERFERENCE_REQ; -- 2.38.1 _______________________________________________ Hostap mailing list Hostap@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/hostap