[PATCH] CSA MBSS: CHAN_SWITCH is always failing.

Benjamin Berg benjamin at sipsolutions.net
Fri Oct 13 02:31:54 PDT 2023


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

> 
> Signed-off-by: Baligh Gasmi <gasmibal at gmail.com>
> ---
>  hostapd/ctrl_iface.c | 8 ++++++--
>  1 file changed, 6 insertions(+), 2 deletions(-)
> 
> diff --git a/hostapd/ctrl_iface.c b/hostapd/ctrl_iface.c
> index f90eb22c4..cf3d65172 100644
> --- a/hostapd/ctrl_iface.c
> +++ b/hostapd/ctrl_iface.c
> @@ -2694,6 +2694,8 @@ static int
> hostapd_ctrl_iface_chan_switch(struct hostapd_iface *iface,
>                 return 0;
>         }
>  
> +       int one_success = 0;
> +       int last_fail = ret;
>         for (i = 0; i < iface->num_bss; i++) {
>  
>                 /* Save CHAN_SWITCH VHT, HE, and EHT config */
> @@ -2704,11 +2706,13 @@ static int
> hostapd_ctrl_iface_chan_switch(struct hostapd_iface *iface,
>                 if (ret) {
>                         /* FIX: What do we do if CSA fails in the
> middle of
>                          * submitting multi-BSS CSA requests? */
> -                       return ret;
> +                       last_fail = ret;
> +               } else {
> +                       one_success = 1;
>                 }
>         }
>  
> -       return 0;
> +       return one_success ? 0 : last_fail;
>  #else /* NEED_AP_MLME */
>         return -1;
>  #endif /* NEED_AP_MLME */



More information about the Hostap mailing list