[PATCH] CSA MBSS: CHAN_SWITCH is always failing.
Benjamin Berg
benjamin at sipsolutions.net
Fri Oct 13 03:14:55 PDT 2023
On Fri, 2023-10-13 at 12:07 +0200, Baligh GASMI wrote:
> >
> > Hi,
> >
> > On Thu, 2023-10-12 at 23:12 +0200, Baligh Gasmi wrote:
> > > When asking hostapd to switch channel in the multi-BSS
> > > configuration,
> > > only the first (associated to the first BSS) request is executed
> > > correctly by some driver, other BSS's request are failing.
> > > This is because multi-BSS configuration is using same Radio and
> > > one
> > > request seems to be suffisant to driver to switch on.
> > >
> > > Solution in here is to return SUCCESS if there was at least one
> > > BSS
> > > switched OK.
> >
> > I think this solution may confuse the internal state a bit as
> > hostapd_switch_channel resets some state on failure and also sets
> > csa_in_progress on success.
> >
> > I am thinking right now that two things might make sense:
> > 1. Either splitting channel switch into three steps, or always
> > switching the BSSs together.
> > 2. Only doing a single call to the driver interface with the
> > information for all BSSs. After all, the switch will need to
> > happen at the same point in time.
> >
> > But, I don't really know right now what underlying drivers are
> > expecting, so maybe the suggestion is just wrong. Another solution
> > could be that the driver detects that the switch is already in
> > progress
> > and ensures a success return if appropriate.
> >
> > Benjamin
> >
>
> Hello,
>
> Sorry, but I do not get it!
> I'm not saying that the patch is correct or to be used as it, trying
> just to understand.
>
> With the patch, when hostapd_switch_channel() fails, that means that
> no switch on any BSS has succussed, so may the reset of the state is
> coherent.
> Other way, if it successed with one BSS (some or all), that means that
> the CSA is ongoing, and having csa_in_progress is coherent too.
I was talking about the internal hostapd state. i.e.:
int hostapd_switch_channel(struct hostapd_data *hapd,
struct csa_settings *settings)
{
int ret;
...
ret = hostapd_drv_switch_channel(hapd, settings);
free_beacon_data(&settings->beacon_csa);
free_beacon_data(&settings->beacon_after);
if (ret) {
/* if we failed, clean cs parameters */
hostapd_cleanup_cs_params(hapd);
return ret;
}
hapd->csa_in_progress = 1;
return 0;
}
If hostapd_drv_switch_channel fails (which you expect to happen), then
csa_in_progress is not set to 1 and hostapd_cleanup_cs_params is
called.
Both of this seem like an undesired side-effect.
Benjamin
>
> I can think about adding CHAN_SWITCH argument, according to which we
> use all BSSes or only the main BSS, but still not global solution I
> think, since we will have to detect driver behaviour to add/remove
> new
> arg.
>
> Baligh
>
More information about the Hostap
mailing list