On Tue, 2014-03-25 at 09:37 +0100, Michal Kazior wrote: > On 25 March 2014 08:59, Luca Coelho <luca@xxxxxxxxx> wrote: > > On Fri, 2014-03-21 at 14:47 +0100, Michal Kazior wrote: > >> Do not allocate more channel contexts than a > >> driver is capable for currently matching interface > >> combination. > >> > >> This allows the ieee80211_vif_reserve_chanctx() to > >> act as a guard against breaking interface > >> combinations. > >> > >> Signed-off-by: Michal Kazior <michal.kazior@xxxxxxxxx> > >> --- > > > > [...] > >> @@ -745,13 +764,16 @@ int ieee80211_vif_reserve_chanctx(struct ieee80211_sub_if_data *sdata, > >> * context, reserve our current context > >> */ > >> new_ctx = curr_ctx; > >> - } else { > >> + } else if (ieee80211_can_create_new_chanctx(local)) { > >> /* create a new context and reserve it */ > >> new_ctx = ieee80211_new_chanctx(local, chandef, mode); > >> if (IS_ERR(new_ctx)) { > >> ret = PTR_ERR(new_ctx); > >> goto out; > >> } > >> + } else { > >> + ret = -EBUSY; > >> + goto out; > > > > I'm not sure about this whole allowed channels counting thing. Does it > > really matter what is the total number of allowed channels? I think the > > actual combinations is what should be checked here. > > > > Let's say the driver supports these combinations: > > > > 1. num_different_channels = 2; limits max 2 APs; > > 2. num_different_channels = 1; limits 1 AP, 1 STA; > > > > Then you're running on a single-channel with 1 AP and 1 STA. The STA > > gets a CSA to move to a new channel. If you only consider the > > max_num_channels you calculated, you will think that it is okay to > > switch, but it is not, because you cannot have 1 AP and 1 STA on > > different channels. > > > > Or am I missing something? > > Yes. You're missing the fact, that ieee80211_max_num_channels() uses > current iftype set to narrow down matching combinations. Exactly, that's what I was missing. :) -- Luca. -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html