AP MLD: Handle authentication and association on link address

The nl80211 driver interface function mlme_event_mgmt_tx_status(),
filled in link_id only if the frame was the last transmitted on the
whole drv (driver) level. With co-hosted MLDs, there could be cases
where multiple frames are sent out by various interfaces (BSS) under the
same drv. Now while handling the TX status, only one interface will get
the proper link_id. Rest will get -1 and the event will be routed to the
first BSS always. If the frame was not sent from the first BSS this
leads to possibility of the frame getting dropped.

Hence to make the underlying link identification easier, modify
authentication and association frames to be always sent with the link
address as A1 and A3 for ease of TX status handling.

Signed-off-by: Sriram R <quic_srirrama@quicinc.com>
Signed-off-by: Aditya Kumar Singh <quic_adisi@quicinc.com>
This commit is contained in:
Sriram R 2024-04-17 09:57:44 +05:30 committed by Jouni Malinen
parent e4e7724560
commit fd1a35e14a

View file

@ -416,14 +416,7 @@ static int send_auth_reply(struct hostapd_data *hapd, struct sta_info *sta,
struct wpabuf *ml_resp = NULL; struct wpabuf *ml_resp = NULL;
#ifdef CONFIG_IEEE80211BE #ifdef CONFIG_IEEE80211BE
/*
* Once a non-AP MLD is added to the driver, the addressing should use
* the MLD MAC address. Thus, use the MLD address instead of translating
* the addresses.
*/
if (ap_sta_is_mld(hapd, sta)) { if (ap_sta_is_mld(hapd, sta)) {
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)
return -1; return -1;
@ -444,7 +437,7 @@ static int send_auth_reply(struct hostapd_data *hapd, struct sta_info *sta,
WLAN_FC_STYPE_AUTH); WLAN_FC_STYPE_AUTH);
os_memcpy(reply->da, dst, ETH_ALEN); os_memcpy(reply->da, dst, ETH_ALEN);
os_memcpy(reply->sa, sa, ETH_ALEN); os_memcpy(reply->sa, sa, ETH_ALEN);
os_memcpy(reply->bssid, bssid, ETH_ALEN); os_memcpy(reply->bssid, sa, ETH_ALEN);
reply->u.auth.auth_alg = host_to_le16(auth_alg); reply->u.auth.auth_alg = host_to_le16(auth_alg);
reply->u.auth.auth_transaction = host_to_le16(auth_transaction); reply->u.auth.auth_transaction = host_to_le16(auth_transaction);
@ -3265,14 +3258,9 @@ static void handle_auth(struct hostapd_data *hapd,
bssid = mgmt->bssid; bssid = mgmt->bssid;
#ifdef CONFIG_IEEE80211BE #ifdef CONFIG_IEEE80211BE
/*
* Once a non-AP MLD is added to the driver, the addressing should use
* the MLD MAC address. It is the responsibility of the driver to
* handle the translations.
*/
if (ap_sta_is_mld(hapd, sta)) { if (ap_sta_is_mld(hapd, sta)) {
dst = sta->addr; dst = sta->addr;
bssid = hapd->mld->mld_addr; bssid = hapd->own_addr;
} }
#endif /* CONFIG_IEEE80211BE */ #endif /* CONFIG_IEEE80211BE */
@ -4823,15 +4811,6 @@ static u16 send_assoc_resp(struct hostapd_data *hapd, struct sta_info *sta,
(reassoc ? WLAN_FC_STYPE_REASSOC_RESP : (reassoc ? WLAN_FC_STYPE_REASSOC_RESP :
WLAN_FC_STYPE_ASSOC_RESP)); WLAN_FC_STYPE_ASSOC_RESP));
#ifdef CONFIG_IEEE80211BE
/*
* Once a non-AP MLD is added to the driver, the addressing should use
* MLD MAC address.
*/
if (ap_sta_is_mld(hapd, sta) && allow_mld_addr_trans)
sa = hapd->mld->mld_addr;
#endif /* CONFIG_IEEE80211BE */
os_memcpy(reply->da, addr, ETH_ALEN); os_memcpy(reply->da, addr, ETH_ALEN);
os_memcpy(reply->sa, sa, ETH_ALEN); os_memcpy(reply->sa, sa, ETH_ALEN);
os_memcpy(reply->bssid, sa, ETH_ALEN); os_memcpy(reply->bssid, sa, ETH_ALEN);