From patchwork Sun Feb 25 07:49:58 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tamizh chelvam X-Patchwork-Id: 10240701 X-Patchwork-Delegate: johannes@sipsolutions.net Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 161B460233 for ; Sun, 25 Feb 2018 07:50:17 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1C0532997B for ; Sun, 25 Feb 2018 07:50:17 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 0F0EF29CC0; Sun, 25 Feb 2018 07:50:17 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 3624329CBE for ; Sun, 25 Feb 2018 07:50:16 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751669AbeBYHuO (ORCPT ); Sun, 25 Feb 2018 02:50:14 -0500 Received: from smtp.codeaurora.org ([198.145.29.96]:54206 "EHLO smtp.codeaurora.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751629AbeBYHuH (ORCPT ); Sun, 25 Feb 2018 02:50:07 -0500 Received: by smtp.codeaurora.org (Postfix, from userid 1000) id 5516F60A05; Sun, 25 Feb 2018 07:50:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1519545007; bh=wHUimBXajOuZVBXkxOW5nuaX+E93fU0pHcYPZOriJj4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=SLUYtmqBdnxA+QDcmAMggI35nE8DgbwyB69q3p+JhQgyI8ZYvqKL1ymCdI+bkYdCX zFC7r+Alm76uUwm3QiNqSCrQkztVgQiq610YmJqa6euixNeDy+NnlaxY504LyxkcUL 4mpF2x22g20o1uP1rhaqkfcJlJC0rYn9RQVZ9oQw= Received: from che-swdbs-01.qca.qualcomm.com (blr-c-bdr-fw-01_globalnat_allzones-outside.qualcomm.com [103.229.19.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: tamizhr@smtp.codeaurora.org) by smtp.codeaurora.org (Postfix) with ESMTPSA id AC75360848; Sun, 25 Feb 2018 07:50:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1519545006; bh=wHUimBXajOuZVBXkxOW5nuaX+E93fU0pHcYPZOriJj4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=KbiPUQbZjGeMSeG5h2UziG7OA3eqHA5iKMzfcprpyyx4uKmoptqft4Rqv+CtlageK ci+cpDEm21KXh7tKChBYbyY24ehHKLRVE3RanQEt9mYfrvX5w5Ari4L97lycw3EWOl 4i3UYf33gMpeVF2gw8fNr2CT5aNwh7qe5qeB6llk= DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org AC75360848 Authentication-Results: pdx-caf-mail.web.codeaurora.org; dmarc=none (p=none dis=none) header.from=codeaurora.org Authentication-Results: pdx-caf-mail.web.codeaurora.org; spf=none smtp.mailfrom=tamizhr@codeaurora.org From: Tamizh chelvam To: johannes@sipsolutions.net Cc: linux-wireless@vger.kernel.org, Tamizh chelvam Subject: [PATCHv4 3/3] mac80211: implement cqm rssi check using rx data signal Date: Sun, 25 Feb 2018 13:19:58 +0530 Message-Id: <1519544998-2621-4-git-send-email-tamizhr@codeaurora.org> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1519544998-2621-1-git-send-email-tamizhr@codeaurora.org> References: <1519544998-2621-1-git-send-email-tamizhr@codeaurora.org> 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: Tamizh chelvam Triggers cfg80211_ap_sta_cqm_rssi_notify with the corresponding event when station signal goes lower than the configured rssi threshold. And notify back to user space once the station signal becomes greater than the configured value. It uses rx data signal and compare with rssi value given by user. This rssi threshold is bss specific and it is common for all the stations. Signed-off-by: Tamizh chelvam --- include/net/mac80211.h | 7 +++++++ net/mac80211/rx.c | 46 +++++++++++++++++++++++++++++++++++++++++++++- net/mac80211/sta_info.h | 9 +++++++++ 3 files changed, 61 insertions(+), 1 deletion(-) diff --git a/include/net/mac80211.h b/include/net/mac80211.h index dc3e9d9..e973bcd 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h @@ -800,6 +800,13 @@ enum mac80211_rate_control_flags { }; +/* + * How many frames need to have been used in average station's + * signal strength before checking against the threshold + */ +#define IEEE80211_STA_SIGNAL_AVE_MIN_COUNT 4 + + /* there are 40 bytes if you don't need the rateset to be kept */ #define IEEE80211_TX_INFO_DRIVER_DATA_SIZE 40 diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c index 2783c5c..611dea5 100644 --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c @@ -1536,6 +1536,47 @@ void ieee80211_sta_uapsd_trigger(struct ieee80211_sta *pubsta, u8 tid) return RX_CONTINUE; } +static void ieee80211_sta_rx_signal_thold_check(struct ieee80211_rx_data *rx) +{ + struct sta_info *sta = rx->sta; + struct ieee80211_bss_conf *bss_conf = + &rx->sdata->vif.bss_conf; + int sig, last_event, thold; + + if (!wiphy_ext_feature_isset(rx->local->hw.wiphy, + NL80211_EXT_FEATURE_AP_STA_CQM_RSSI_CONFIG)) + return; + + sta->count_rx_signal++; + if (sta->count_rx_signal < IEEE80211_STA_SIGNAL_AVE_MIN_COUNT) + return; + + if (!bss_conf->cqm_rssi_thold || !bss_conf->enable_beacon) { + sta->count_rx_signal = 0; + return; + } + + sig = -ewma_signal_read(&sta->rx_stats_avg.signal); + last_event = sta->last_cqm_event_signal; + thold = bss_conf->cqm_rssi_thold; + + if (sig < thold && last_event == 0) { + sta->last_cqm_event_signal = sig; + cfg80211_ap_sta_cqm_rssi_notify( + rx->sdata->dev, sta->addr, + NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW, + sig, GFP_ATOMIC); + sta->count_rx_signal = 0; + } else if (last_event && sig > thold) { + sta->last_cqm_event_signal = 0; + cfg80211_ap_sta_cqm_rssi_notify( + rx->sdata->dev, sta->addr, + NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH, + sig, GFP_ATOMIC); + sta->count_rx_signal = 0; + } +} + static ieee80211_rx_result debug_noinline ieee80211_rx_h_sta_process(struct ieee80211_rx_data *rx) { @@ -1591,6 +1632,7 @@ void ieee80211_sta_uapsd_trigger(struct ieee80211_sta *pubsta, u8 tid) if (!(status->flag & RX_FLAG_NO_SIGNAL_VAL)) { sta->rx_stats.last_signal = status->signal; ewma_signal_add(&sta->rx_stats_avg.signal, -status->signal); + ieee80211_sta_rx_signal_thold_check(rx); } if (status->chains) { @@ -4000,9 +4042,11 @@ static bool ieee80211_invoke_fast_rx(struct ieee80211_rx_data *rx, if (!(status->flag & RX_FLAG_NO_SIGNAL_VAL)) { stats->last_signal = status->signal; - if (!fast_rx->uses_rss) + if (!fast_rx->uses_rss) { ewma_signal_add(&sta->rx_stats_avg.signal, -status->signal); + ieee80211_sta_rx_signal_thold_check(rx); + } } if (status->chains) { diff --git a/net/mac80211/sta_info.h b/net/mac80211/sta_info.h index f64eb86..2127803 100644 --- a/net/mac80211/sta_info.h +++ b/net/mac80211/sta_info.h @@ -481,6 +481,12 @@ struct ieee80211_sta_rx_stats { * @pcpu_rx_stats: per-CPU RX statistics, assigned only if the driver needs * this (by advertising the USES_RSS hw flag) * @status_stats: TX status statistics + * @last_cqm_event_signal: Last data frame signal strength average that + * triggered a cqm event for a connected station. 0 indicates that no + * event has been generated for the station. + * @count_rx_signal: Number of data frames used in avg signal for a station. + * This can be used to avoid generating less reliable cqm events for + * the station. */ struct sta_info { /* General information, mostly static */ @@ -581,6 +587,9 @@ struct sta_info { struct cfg80211_chan_def tdls_chandef; + int last_cqm_event_signal; + unsigned int count_rx_signal; + /* keep last! */ struct ieee80211_sta sta; };