From patchwork Fri May 2 13:40:30 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luca Coelho X-Patchwork-Id: 4102061 Return-Path: X-Original-To: patchwork-linux-wireless@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id E3F269F169 for ; Fri, 2 May 2014 13:41:24 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 0652D2024C for ; Fri, 2 May 2014 13:41:24 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 0BABA2022A for ; Fri, 2 May 2014 13:41:23 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751805AbaEBNlU (ORCPT ); Fri, 2 May 2014 09:41:20 -0400 Received: from dedo.coelho.fi ([88.198.205.34]:39201 "EHLO dedo.coelho.fi" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1751643AbaEBNlP (ORCPT ); Fri, 2 May 2014 09:41:15 -0400 Received: from a88-113-225-236.elisa-laajakaista.fi ([88.113.225.236] helo=localhost.localdomain) by dedo with esmtpsa (TLS1.2:RSA_AES_128_CBC_SHA256:128) (Exim 4.80) (envelope-from ) id 1WgDiE-0007GR-8o; Fri, 02 May 2014 16:41:14 +0300 From: Luca Coelho To: linux-wireless@vger.kernel.org, johannes@sipsolutions.net Cc: michal.kazior@tieto.com Date: Fri, 2 May 2014 16:40:30 +0300 Message-Id: <1399038031-23206-3-git-send-email-luca@coelho.fi> X-Mailer: git-send-email 1.9.2 In-Reply-To: <1399038031-23206-1-git-send-email-luca@coelho.fi> References: <1399038031-23206-1-git-send-email-luca@coelho.fi> X-SA-Exim-Connect-IP: 88.113.225.236 X-SA-Exim-Mail-From: luca@coelho.fi X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Spam-Level: X-Spam-Status: No, score=-7.5 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 Subject: [PATCH 3/4] mac80211: send channel switch failed notifications X-SA-Exim-Version: 4.2.1 (built Mon, 26 Dec 2011 16:24:06 +0000) X-SA-Exim-Scanned: Yes (on dedo) Sender: linux-wireless-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Luciano Coelho Send a channel switch failed notification to userspace when an ongoing channel swith fails. Signed-off-by: Luciano Coelho --- net/mac80211/cfg.c | 30 +++++++++++++++++++++++------- net/mac80211/iface.c | 6 +++++- net/mac80211/mlme.c | 9 ++++++++- 3 files changed, 36 insertions(+), 9 deletions(-) diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c index 53a2cfe..f8958e0 100644 --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c @@ -1101,9 +1101,13 @@ static int ieee80211_stop_ap(struct wiphy *wiphy, struct net_device *dev) old_probe_resp = sdata_dereference(sdata->u.ap.probe_resp, sdata); /* abort any running channel switch */ - sdata->vif.csa_active = false; - kfree(sdata->u.ap.next_beacon); - sdata->u.ap.next_beacon = NULL; + if (sdata->vif.csa_active) { + cfg80211_ch_switch_failed_notify(sdata->dev, + &sdata->csa_chandef); + sdata->vif.csa_active = false; + kfree(sdata->u.ap.next_beacon); + sdata->u.ap.next_beacon = NULL; + } /* turn off carrier for this interface and dependent VLANs */ list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list) @@ -3030,8 +3034,11 @@ 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); mutex_unlock(&local->mtx); - if (WARN_ON(err < 0)) + if (WARN_ON(err < 0)) { + cfg80211_ch_switch_failed_notify(sdata->dev, + &sdata->csa_chandef); return; + } if (!local->use_chanctx) { local->_oper_chandef = sdata->csa_chandef; @@ -3045,21 +3052,30 @@ static void ieee80211_csa_finalize(struct ieee80211_sub_if_data *sdata) kfree(sdata->u.ap.next_beacon); sdata->u.ap.next_beacon = NULL; - if (err < 0) + if (err < 0) { + cfg80211_ch_switch_failed_notify(sdata->dev, + &sdata->csa_chandef); return; + } changed |= err; break; case NL80211_IFTYPE_ADHOC: err = ieee80211_ibss_finish_csa(sdata); - if (err < 0) + if (err < 0) { + cfg80211_ch_switch_failed_notify(sdata->dev, + &sdata->csa_chandef); return; + } changed |= err; break; #ifdef CONFIG_MAC80211_MESH case NL80211_IFTYPE_MESH_POINT: err = ieee80211_mesh_finish_csa(sdata); - if (err < 0) + if (err < 0) { + cfg80211_ch_switch_failed_notify(sdata->dev, + &sdata->csa_chandef); return; + } changed |= err; break; #endif diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c index 7fff3dc..578f6e6 100644 --- a/net/mac80211/iface.c +++ b/net/mac80211/iface.c @@ -838,7 +838,11 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata, cancel_work_sync(&sdata->recalc_smps); sdata_lock(sdata); - sdata->vif.csa_active = false; + if (sdata->vif.csa_active) { + sdata->vif.csa_active = false; + cfg80211_ch_switch_failed_notify(sdata->dev, + &sdata->csa_chandef); + } sdata_unlock(sdata); cancel_work_sync(&sdata->csa_finalize_work); diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index 139005d..beff8c8 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c @@ -958,6 +958,8 @@ static void ieee80211_chswitch_work(struct work_struct *work) "vif channel switch failed, disconnecting\n"); ieee80211_queue_work(&sdata->local->hw, &ifmgd->csa_connection_drop_work); + cfg80211_ch_switch_failed_notify(sdata->dev, + &sdata->csa_chandef); goto out; } @@ -2060,7 +2062,12 @@ static void __ieee80211_disconnect(struct ieee80211_sub_if_data *sdata) WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY, true, frame_buf); ifmgd->flags &= ~IEEE80211_STA_CSA_RECEIVED; - sdata->vif.csa_active = false; + + if (sdata->vif.csa_active) { + cfg80211_ch_switch_failed_notify(sdata->dev, + &sdata->csa_chandef); + sdata->vif.csa_active = false; + } ieee80211_wake_queues_by_reason(&sdata->local->hw, IEEE80211_MAX_QUEUE_MAP, IEEE80211_QUEUE_STOP_REASON_CSA);