Message ID | 20231003164326.857433-1-greearb@candelatech.com (mailing list archive) |
---|---|
State | Rejected |
Delegated to: | Johannes Berg |
Headers | show |
Series | mac80211: Allow STA to connect in AX mode to MLD AP. | expand |
On Tue, 2023-10-03 at 09:43 -0700, greearb@candelatech.com wrote: > From: Ben Greear <greearb@candelatech.com> > > Check if user has configured STA to be AX mode, and if so, > skip the check for MLD elements (as they would not be needed > in AX mode). Eh, no, I think this is wrong. > > if (ieee80211_vif_is_mld(&sdata->vif)) { If you get past this if, you've (locally) committed to doing EHT already, not just HE (née 11ax), so should have an EHT connection? Though the change is hard to read - but why are you telling the supplicant to connect with MLO if you wanted to not use EHT? johannes
On 10/4/23 12:38, Johannes Berg wrote: > On Tue, 2023-10-03 at 09:43 -0700, greearb@candelatech.com wrote: >> From: Ben Greear <greearb@candelatech.com> >> >> Check if user has configured STA to be AX mode, and if so, >> skip the check for MLD elements (as they would not be needed >> in AX mode). > > Eh, no, I think this is wrong. > >> >> if (ieee80211_vif_is_mld(&sdata->vif)) { > > If you get past this if, you've (locally) committed to doing EHT > already, not just HE (née 11ax), so should have an EHT connection? > > Though the change is hard to read - but why are you telling the > supplicant to connect with MLO if you wanted to not use EHT? It is mostly white-space changes, but the diff is ugly. I caused the DISABLE_EHT flag to be set in mac80211, and that generally seems to work in my kernel, but something is still trying to do MLO I guess. I did not specifically tell supplicant to do MLO, and in fact I told it to disable_be, but maybe that is not fully implemented. My supplicant is a few months old vs upstream at this point. Thanks, Ben
On 10/4/23 13:36, Ben Greear wrote: > On 10/4/23 12:38, Johannes Berg wrote: >> On Tue, 2023-10-03 at 09:43 -0700, greearb@candelatech.com wrote: >>> From: Ben Greear <greearb@candelatech.com> >>> >>> Check if user has configured STA to be AX mode, and if so, >>> skip the check for MLD elements (as they would not be needed >>> in AX mode). >> >> Eh, no, I think this is wrong. >> >>> >>> if (ieee80211_vif_is_mld(&sdata->vif)) { >> >> If you get past this if, you've (locally) committed to doing EHT >> already, not just HE (née 11ax), so should have an EHT connection? >> >> Though the change is hard to read - but why are you telling the >> supplicant to connect with MLO if you wanted to not use EHT? > > It is mostly white-space changes, but the diff is ugly. > > I caused the DISABLE_EHT flag to be set in mac80211, and that generally > seems to work in my kernel, but something is still trying to do MLO I guess. > > I did not specifically tell supplicant to do MLO, and in fact I told > it to disable_be, but maybe that is not fully implemented. My supplicant > is a few months old vs upstream at this point. I created a patch to supplicant where it will disable MLO if disable_eht is true, and that seems to have properly associated a non-MLO station in AX mode. So I agree that my patch to the kernel is not needed. Thanks for the patch review and comments. Thanks, Ben
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index e7d42545851f..5fb0bdad88f4 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c @@ -5550,34 +5550,39 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata, } if (ieee80211_vif_is_mld(&sdata->vif)) { - if (!elems->ml_basic) { - sdata_info(sdata, - "MLO association with %pM but no multi-link element in response!\n", - assoc_data->ap_addr); - goto abandon_assoc; - } - - if (le16_get_bits(elems->ml_basic->control, - IEEE80211_ML_CONTROL_TYPE) != - IEEE80211_ML_CONTROL_TYPE_BASIC) { - sdata_info(sdata, - "bad multi-link element (control=0x%x)\n", - le16_to_cpu(elems->ml_basic->control)); - goto abandon_assoc; - } else { - struct ieee80211_mle_basic_common_info *common; - - common = (void *)elems->ml_basic->variable; + struct ieee80211_link_data *link; - if (memcmp(assoc_data->ap_addr, - common->mld_mac_addr, ETH_ALEN)) { + link = sdata_dereference(sdata->link[0], sdata); + if (!(link && (link->u.mgd.conn_flags & IEEE80211_CONN_DISABLE_EHT))) { + if (!elems->ml_basic) { sdata_info(sdata, - "AP MLD MAC address mismatch: got %pM expected %pM\n", - common->mld_mac_addr, + "MLO association with %pM but no multi-link element in response!\n", assoc_data->ap_addr); goto abandon_assoc; } - } + + if (le16_get_bits(elems->ml_basic->control, + IEEE80211_ML_CONTROL_TYPE) != + IEEE80211_ML_CONTROL_TYPE_BASIC) { + sdata_info(sdata, + "bad multi-link element (control=0x%x)\n", + le16_to_cpu(elems->ml_basic->control)); + goto abandon_assoc; + } else { + struct ieee80211_mle_basic_common_info *common; + + common = (void *)elems->ml_basic->variable; + + if (memcmp(assoc_data->ap_addr, + common->mld_mac_addr, ETH_ALEN)) { + sdata_info(sdata, + "AP MLD MAC address mismatch: got %pM expected %pM\n", + common->mld_mac_addr, + assoc_data->ap_addr); + goto abandon_assoc; + } + } + } /* if we are not configured to disable EHT */ } sdata->vif.cfg.aid = aid;