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
This commit is contained in:
Ajit Pal Singh 2017-04-18 18:53:46 +05:30 • committed by snandini
commit 90a45a4f92

View file

@ -109,6 +109,7 @@
#include <qca_vendor.h>
#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),