Skip to content

Commit

Permalink
mac80211: disconnect iface if CSA unexpectedly fails
Browse files Browse the repository at this point in the history
It doesn't make much sense to leave a crippled
interface running.

As a side effect this will unblock tx queues with
CSA reason immediately after failure instead of
until after userspace requests interface to stop.

This also gives userspace an opportunity to
indirectly see CSA failure.

Signed-off-by: Michal Kazior <michal.kazior@tieto.com>
[small code cleanup]
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
  • Loading branch information
Michal Kazior authored and Johannes Berg committed May 8, 2014
1 parent 771bb3d commit cf8767d
Showing 1 changed file with 15 additions and 4 deletions.
19 changes: 15 additions & 4 deletions net/mac80211/cfg.c
Original file line number Diff line number Diff line change
Expand Up @@ -3090,7 +3090,7 @@ static int ieee80211_set_after_csa_beacon(struct ieee80211_sub_if_data *sdata,
return 0;
}

static void ieee80211_csa_finalize(struct ieee80211_sub_if_data *sdata)
static int __ieee80211_csa_finalize(struct ieee80211_sub_if_data *sdata)
{
struct ieee80211_local *local = sdata->local;
u32 changed = 0;
Expand All @@ -3101,8 +3101,8 @@ static void ieee80211_csa_finalize(struct ieee80211_sub_if_data *sdata)

sdata->radar_required = sdata->csa_radar_required;
err = ieee80211_vif_change_channel(sdata, &changed);
if (WARN_ON(err < 0))
return;
if (err < 0)
return err;

if (!local->use_chanctx) {
local->_oper_chandef = sdata->csa_chandef;
Expand All @@ -3113,7 +3113,7 @@ static void ieee80211_csa_finalize(struct ieee80211_sub_if_data *sdata)

err = ieee80211_set_after_csa_beacon(sdata, &changed);
if (err)
return;
return err;

ieee80211_bss_info_change_notify(sdata, changed);
cfg80211_ch_switch_notify(sdata->dev, &sdata->csa_chandef);
Expand All @@ -3122,6 +3122,17 @@ static void ieee80211_csa_finalize(struct ieee80211_sub_if_data *sdata)
ieee80211_wake_queues_by_reason(&local->hw,
IEEE80211_MAX_QUEUE_MAP,
IEEE80211_QUEUE_STOP_REASON_CSA);

return 0;
}

static void ieee80211_csa_finalize(struct ieee80211_sub_if_data *sdata)
{
if (__ieee80211_csa_finalize(sdata)) {
sdata_info(sdata, "failed to finalize CSA, disconnecting\n");
cfg80211_stop_iface(sdata->local->hw.wiphy, &sdata->wdev,
GFP_KERNEL);
}
}

void ieee80211_csa_finalize_work(struct work_struct *work)
Expand Down

0 comments on commit cf8767d

Please sign in to comment.