summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2017-04-10 01:43:14 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2017-04-10 01:43:14 -0700
commitfe7a21f601ea3bdf2f695ba445b2ad7d583fc866 (patch)
treed23809ad6303430c8dab3a94b7652d7144669d58
parent5f48586f84e459f761b0086ff36815c21382efa9 (diff)
parent243bfe008d8782e5a6fe51f81c76edf318f4a190 (diff)
Merge "qcacld-2.0: Add sta vdev count sanity check" into wlan-cld2.driver.lnx.1.0-dev
-rw-r--r--CORE/HDD/inc/wlan_hdd_main.h12
-rw-r--r--CORE/HDD/src/wlan_hdd_cfg80211.c9
-rw-r--r--CORE/HDD/src/wlan_hdd_main.c34
3 files changed, 55 insertions, 0 deletions
diff --git a/CORE/HDD/inc/wlan_hdd_main.h b/CORE/HDD/inc/wlan_hdd_main.h
index 525dd9cedb53..64e27800e3e0 100644
--- a/CORE/HDD/inc/wlan_hdd_main.h
+++ b/CORE/HDD/inc/wlan_hdd_main.h
@@ -632,6 +632,8 @@ typedef enum device_mode
WLAN_HDD_NDI
} device_mode_t;
+#define WLAN_HDD_VDEV_STA_MAX 2
+
typedef enum rem_on_channel_request_type
{
REMAIN_ON_CHANNEL_REQUEST,
@@ -2127,6 +2129,16 @@ VOS_STATUS hdd_add_adapter_back( hdd_context_t *pHddCtx,
VOS_STATUS hdd_add_adapter_front( hdd_context_t *pHddCtx,
hdd_adapter_list_node_t* pAdapterNode);
+/**
+ * hdd_get_current_vdev_sta_count() - get currnet vdev sta count
+ * @hdd_ctx: hdd context
+ *
+ * Traverse the adapter list to get the vdev sta count
+ *
+ * Return: vdev sta count
+ */
+uint32_t hdd_get_current_vdev_sta_count(hdd_context_t *hdd_ctx);
+
hdd_adapter_t* hdd_open_adapter( hdd_context_t *pHddCtx, tANI_U8 session_type,
const char* name, tSirMacAddr macAddr,
unsigned char name_assign_type,
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index fc0694fe9393..28dfe9b0213a 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -17963,6 +17963,15 @@ static int __wlan_hdd_cfg80211_change_iface(struct wiphy *wiphy,
case NL80211_IFTYPE_STATION:
case NL80211_IFTYPE_P2P_CLIENT:
case NL80211_IFTYPE_ADHOC:
+
+ if (WLAN_HDD_VDEV_STA_MAX ==
+ hdd_get_current_vdev_sta_count(pHddCtx)) {
+ hddLog(VOS_TRACE_LEVEL_DEBUG,
+ FL("Unable to change as sta interface: max sta cnt is %d"),
+ WLAN_HDD_VDEV_STA_MAX);
+ return -EINVAL;
+ }
+
status = wlan_hdd_change_client_iface_to_new_mode(ndev, type);
if (status != 0)
return status;
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c
index ada6ccb30dfc..6958cb24c905 100644
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -11046,6 +11046,30 @@ VOS_STATUS hdd_check_for_existing_macaddr( hdd_context_t *pHddCtx,
return VOS_STATUS_SUCCESS;
}
+uint32_t hdd_get_current_vdev_sta_count(hdd_context_t *hdd_ctx)
+{
+ hdd_adapter_t *adapter;
+ hdd_adapter_list_node_t *hdd_adapter_node, *next;
+ VOS_STATUS status;
+ uint32_t vdev_sta_cnt = 0;
+
+ status = hdd_get_front_adapter(hdd_ctx, &hdd_adapter_node);
+
+ while (NULL != hdd_adapter_node && VOS_STATUS_SUCCESS == status) {
+ adapter = hdd_adapter_node->pAdapter;
+ if ((NULL != adapter) &&
+ ((WLAN_HDD_INFRA_STATION == adapter->device_mode) ||
+ (WLAN_HDD_P2P_CLIENT == adapter->device_mode) ||
+ (WLAN_HDD_IBSS == adapter->device_mode)))
+ vdev_sta_cnt++;
+
+ status = hdd_get_next_adapter(hdd_ctx, hdd_adapter_node, &next);
+ hdd_adapter_node = next;
+ }
+
+ return vdev_sta_cnt;
+}
+
hdd_adapter_t* hdd_open_adapter( hdd_context_t *pHddCtx, tANI_U8 session_type,
const char *iface_name, tSirMacAddr macAddr,
unsigned char name_assign_type,
@@ -11071,6 +11095,16 @@ hdd_adapter_t* hdd_open_adapter( hdd_context_t *pHddCtx, tANI_U8 session_type,
return NULL;
}
+ if (((WLAN_HDD_INFRA_STATION == session_type) ||
+ (WLAN_HDD_P2P_CLIENT == session_type) ||
+ (WLAN_HDD_IBSS == session_type)) &&
+ (WLAN_HDD_VDEV_STA_MAX == hdd_get_current_vdev_sta_count(pHddCtx))) {
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: Unable to add sta interface: max sta cnt is %d",
+ __func__, WLAN_HDD_VDEV_STA_MAX);
+ return NULL;
+ }
+
if (hdd_cfg_is_sub20_channel_width_enabled(pHddCtx) &&
pHddCtx->current_intf_count >= 1) {
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,