[PATCH 01/16] hostapd: MLO: avoid usage of mld_id as user configuration

Aditya Kumar Singh quic_adisi at quicinc.com
Mon Mar 18 05:19:58 PDT 2024


On 3/18/24 16:23, Benjamin Berg wrote:
...
>> diff --git a/src/ap/beacon.c b/src/ap/beacon.c
>> index e50f0a0c976e..9c028b5b72d6 100644
>> --- a/src/ap/beacon.c
>> +++ b/src/ap/beacon.c
>> @@ -960,7 +960,7 @@ static void
>> hostapd_fill_probe_resp_ml_params(struct hostapd_data *hapd,
>>   	 * We want to include the AP MLD ID in the response if it
>> was
>>   	 * included in the request.
>>   	 */
>> -	probed_mld_id = mld_id != -1 ? mld_id : hapd->conf->mld_id;
>> +	probed_mld_id = mld_id != -1 ? mld_id :
>> hostapd_get_mld_id(hapd);
> 
> We are not (yet) hitting these code paths. But, I think conceptually it
> would make more sense to get the probed hapd from the MLD ID. i.e.
> something like:
>       probed_hapd = mld_id == 0 ? hapd : hostapd_get_mbssid_hapd(hapd, mld_id);
> 

Yes correct. But fixes regarding MLO+MBSSID is in later part of our 
work. As you rightly said, this we are not hitting as of today. Also, 
this patch series tries to just support 1 MLD interface (as it was doing 
already before this) and at the same time just scale up certain 
structures/handling so that it can be leveraged when support for 
multiple MLD interfaces (co-hosted) is added later (this I'm working on 
right now and will probably send out series soon :)). So at that time 
this would be fixed properly.

>>   	for_each_mld_link(link, i, j, hapd->iface->interfaces,
>>   			  probed_mld_id) {
> 
> Then we need to change the iteration, but I think that makes sense
> anyway, see below.
> 

...			\
>> @@ -794,7 +798,7 @@ int hostapd_link_remove(struct hostapd_data
>> *hapd, u32 count);
>>   			for (_link
>> =					\
>>   			     (_ifaces)->iface[_iface_idx]-
>>> bss[_bss_idx]; \
>>   			    _link && _link->conf->mld_ap
>> &&		\
>> -				_link->conf->mld_id ==
>> _mld_id;		\
>> +				hostapd_get_mld_id(_link) ==
>> _mld_id;		\
>>   			    _link = NULL)
> 
> I think this part is slightly wrong, as the mld_id here would be local
> to the link, but it should to be local to the hapd from which we
> started the iteration.
> 
> Maybe we can update the macro and simplify it a bit at the same time.
> We always have an hapd instance anyway, so passing the interfaces
> explicitly does not really make sense. So, we can just start with an
> hapd instance, and iterate all links (including itself). Something
> like:
> 
> #define for_each_mld_link(_hapd, _link, _bss_idx, _iface_idx)		\
> 	for (_iface_idx = 0;						\
> 	     _iface_idx < (_hapd)->iface->interfaces)->count;		\
> 	     _iface_idx++)						\
> 		for (_bss_idx = 0;					\
> 		     _bss_idx <						\
> 			(_ifaces)->iface[_iface_idx]->num_bss;		\
> 		     _bss_idx++)					\
> 			for (_link =					\
> 			     (_hapd)->iface->interfaces->		\
> 				iface[_iface_idx]->bss[_bss_idx]; 	\
> 			    _link &&					\
> 				hostapd_is_ml_partner(_link, _hapd);	\
> 			    _link = NULL)
> 
> Benjamin

Yeah that makes sense. Thanks for the input! But as I said above, in the 
next series, actually this logic will be replaced with another one. 
Hence did not change much here.

Now (after this series) since we have all affiliated links tied up to a 
common MLD structure via a list member, there is no need of these many 
arguments for this macro. We can just use dl_list_for_each() and iterate 
over all affiliated links.





More information about the Hostap mailing list