From 90a45a4f9294d1bc5062232b81ee5ee77c77ffc6 Mon Sep 17 00:00:00 2001 From: Ajit Pal Singh Date: Tue, 18 Apr 2017 18:53:46 +0530 Subject: [PATCH] qcacld-3.0: Reject connect if Do_Not_Switch_Channel set In a case when a STA interface is existing and AP/GO comes up as the second interface, it might happen that the 'scan list' of the existing STA interface has not been refreshed yet. It might be displaying a third-party-AP which is on a different channel than our AP/GO-interface. If the STA tries to connect to the third-party-AP, then the connection is rejected if 1) Do_Not_Switch_Channel is set for the AP/GO vdev AND 2) The third-party-AP channel is on the same band but is different from the AP/GO-interface channel. If the third-party-AP and our AP/GO-interface channels are same OR in different bands, then the connection is allowed to go through. Change-Id: I940665ac38864cc8a16912c714412dd4c8d819d6 CRs-Fixed: 2036903 --- core/hdd/src/wlan_hdd_cfg80211.c | 36 ++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c index f1de64c72132..d4618037c25c 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/core/hdd/src/wlan_hdd_cfg80211.c @@ -109,6 +109,7 @@ #include #include "wlan_pmo_ucfg_api.h" #include "os_if_wifi_pos.h" +#include "wlan_utility.h" #define g_mode_rates_size (12) #define a_mode_rates_size (8) @@ -14262,6 +14263,41 @@ static int __wlan_hdd_cfg80211_connect(struct wiphy *wiphy, /* Check for max concurrent connections after doing disconnect if any */ if (req->channel) { + bool ok; + + if (req->channel->hw_value && policy_mgr_is_chan_ok_for_dnbs( + pHddCtx->hdd_psoc, + req->channel->hw_value, + &ok)) { + hdd_warn("Unable to get channel:%d eligibility for DNBS", + req->channel->hw_value); + return -EINVAL; + } + /** + * Send connection timedout, so that Android framework does not + * blacklist us. + */ + if (!ok) { + struct ieee80211_channel *chan = + __ieee80211_get_channel(wiphy, + wlan_chan_to_freq(req->channel->hw_value)); + struct cfg80211_bss *bss; + + hdd_warn("Channel:%d not OK for DNBS", + req->channel->hw_value); + if (chan) { + bss = hdd_cfg80211_get_bss(wiphy, + chan, + req->bssid, req->ssid, + req->ssid_len); + if (bss) { + cfg80211_assoc_timeout(ndev, bss); + return -ETIMEDOUT; + } + } + return -EINVAL; + } + if (!policy_mgr_allow_concurrency(pHddCtx->hdd_psoc, policy_mgr_convert_device_mode_to_qdf_type( pAdapter->device_mode),