diff options
| author | Linux Build Service Account <lnxbuild@localhost> | 2017-04-10 01:43:14 -0700 |
|---|---|---|
| committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2017-04-10 01:43:14 -0700 |
| commit | fe7a21f601ea3bdf2f695ba445b2ad7d583fc866 (patch) | |
| tree | d23809ad6303430c8dab3a94b7652d7144669d58 | |
| parent | 5f48586f84e459f761b0086ff36815c21382efa9 (diff) | |
| parent | 243bfe008d8782e5a6fe51f81c76edf318f4a190 (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.h | 12 | ||||
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_cfg80211.c | 9 | ||||
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_main.c | 34 |
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, |
