From patchwork Thu Sep 23 18:27:51 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Johannes Berg X-Patchwork-Id: 202612 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter1.kernel.org (8.14.4/8.14.3) with ESMTP id o8NIS9uN024955 for ; Thu, 23 Sep 2010 18:28:09 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756054Ab0IWS1y (ORCPT ); Thu, 23 Sep 2010 14:27:54 -0400 Received: from he.sipsolutions.net ([78.46.109.217]:36754 "EHLO sipsolutions.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756046Ab0IWS1y (ORCPT ); Thu, 23 Sep 2010 14:27:54 -0400 Received: by sipsolutions.net with esmtpsa (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.72) (envelope-from ) id 1OyqWO-0006jZ-Tk; Thu, 23 Sep 2010 20:27:53 +0200 Subject: [RFC] mac80211: fix release_reorder_timeout in scan From: Johannes Berg To: wireless Cc: Jouni Malinen , Christian Lamparter Date: Thu, 23 Sep 2010 20:27:51 +0200 Message-ID: <1285266471.3770.384.camel@jlt3.sipsolutions.net> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Sender: linux-wireless-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.3 (demeter1.kernel.org [140.211.167.41]); Thu, 23 Sep 2010 18:28:09 +0000 (UTC) --- wireless-testing.orig/net/mac80211/rx.c 2010-09-23 16:13:40.000000000 +0200 +++ wireless-testing/net/mac80211/rx.c 2010-09-23 16:58:02.000000000 +0200 @@ -388,20 +388,20 @@ ieee80211_rx_h_passive_scan(struct ieee8 { struct ieee80211_local *local = rx->local; struct sk_buff *skb = rx->skb; + struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb); + ieee80211_rx_result ret; - if (unlikely(test_bit(SCAN_HW_SCANNING, &local->scanning))) - return ieee80211_scan_rx(rx->sdata, skb); - - if (unlikely(test_bit(SCAN_SW_SCANNING, &local->scanning) && - (rx->flags & IEEE80211_RX_IN_SCAN))) { - /* drop all the other packets during a software scan anyway */ - if (ieee80211_scan_rx(rx->sdata, skb) != RX_QUEUED) - dev_kfree_skb(skb); - return RX_QUEUED; - } + if (likely(!(rx->flags & IEEE80211_RX_IN_SCAN))) + return RX_CONTINUE; - if (unlikely(rx->flags & IEEE80211_RX_IN_SCAN)) { - /* scanning finished during invoking of handlers */ + ret = ieee80211_scan_rx(rx->sdata, skb); + if (ret != RX_CONTINUE) + return ret; + + if (status->freq != local->oper_channel->center_freq && + (!local->tmp_channel || + status->freq != local->tmp_channel->center_freq)) { + /* ignore scan channel RX */ I802_DEBUG_INC(local->rx_handlers_drop_passive_scan); return RX_DROP_UNUSABLE; } @@ -2500,10 +2500,6 @@ void ieee80211_release_reorder_timeout(s rx.queue = tid; rx.flags |= IEEE80211_RX_RA_MATCH; - if (unlikely(test_bit(SCAN_HW_SCANNING, &sta->local->scanning) || - test_bit(SCAN_OFF_CHANNEL, &sta->local->scanning))) - rx.flags |= IEEE80211_RX_IN_SCAN; - spin_lock(&tid_agg_rx->reorder_lock); ieee80211_sta_reorder_release(&sta->local->hw, tid_agg_rx, &frames); spin_unlock(&tid_agg_rx->reorder_lock);