parsing the multi-link element with STA profile wifi: mac80211: support MLO authentication/association with one link

Wen Gong quic_wgong at quicinc.com
Sat Apr 15 19:10:19 PDT 2023


On 9/29/2022 3:28 AM, Johannes Berg wrote:
> On Wed, 2022-09-28 at 23:33 +0800, Wen Gong wrote:

...

Hi Johannes,

The change below which added in ieee80211_rx_mgmt_assoc_resp() by
patch "wifi: mac80211: support MLO authentication/association with one 
link (commit 81151ce462e5)"
maybe need refine to meet 2 links.

I hit issue that the BSS of the 2 link will always hold and never free.

My case is:
When connect with 2 links AP, the cfg80211_hold_bss() is called by 
cfg80211_mlme_assoc()
for each BSS of the 2 links,

When asssocResp from AP is not success(such as status_code==1), the 
ieee80211_link_data of 2nd link(sdata->link[link_id])
is NULL because ieee80211_assoc_success()->ieee80211_vif_update_links() 
is not called.

Then struct cfg80211_rx_assoc_resp resp in cfg80211_rx_assoc_resp() and
struct cfg80211_connect_resp_params cr in __cfg80211_connect_result() 
will only have the data of
the 1st link, and finally cfg80211_connect_result_release_bsses() only 
call cfg80211_unhold_bss()
for the 1st link, then BSS of the 2nd link will never free because its 
hold is awlays > 0 now.

I found it is not easy to refine it, so do you have any advise/idea?

for (link_id = 0; link_id < IEEE80211_MLD_MAX_NUM_LINKS; link_id++) {
         struct ieee80211_link_data *link;

         link = sdata_dereference(sdata->link[link_id], sdata);
         if (!link)
             continue;

         if (!assoc_data->link[link_id].bss)
             continue;

         resp.links[link_id].bss = assoc_data->link[link_id].bss;
         resp.links[link_id].addr = link->conf->addr;
         resp.links[link_id].status = assoc_data->link[link_id].status;




More information about the ath11k mailing list