From 33bf18f2efedf6ebd5626a4184f1c586eb5328ce Mon Sep 17 00:00:00 2001 From: Rachit Kankane Date: Thu, 20 Jun 2019 08:05:07 +0530 Subject: [PATCH] qcacld-3.0: Check vdev max limit before creating Firmware allocates memory as part of WMI_INIT_CMDID based on number of STA vdevs and max number of vdevs. If we try to create more then max limit then firmware will crash. Added check to check for max limit before creating the interface. Change-Id: I3e73c9f1b3c925465452a23ea5f25f47e4eb1ada CRs-Fixed: 2468171 --- core/hdd/src/wlan_hdd_main.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c index 250a1a79ea7b..8da3cdf3c2a5 100644 --- a/core/hdd/src/wlan_hdd_main.c +++ b/core/hdd/src/wlan_hdd_main.c @@ -5096,6 +5096,19 @@ static void wlan_hdd_cfg80211_scan_block_cb(struct work_struct *work) osif_vdev_sync_op_stop(vdev_sync); } +static u8 hdd_get_mode_specific_interface_count(struct hdd_context *hdd_ctx, + enum QDF_OPMODE mode) +{ + struct hdd_adapter *adapter = NULL; + u8 intf_count = 0; + + hdd_for_each_adapter(hdd_ctx, adapter) { + if (adapter->device_mode == mode) + intf_count++; + } + return intf_count; +} + /** * hdd_open_adapter() - open and setup the hdd adatper * @hdd_ctx: global hdd context @@ -5118,6 +5131,7 @@ struct hdd_adapter *hdd_open_adapter(struct hdd_context *hdd_ctx, uint8_t sessio { struct net_device *ndev = NULL; struct hdd_adapter *adapter = NULL; + u8 intf_count = 0; QDF_STATUS status = QDF_STATUS_E_FAILURE; if (hdd_ctx->current_intf_count >= hdd_ctx->max_intf_count) { @@ -5163,6 +5177,18 @@ struct hdd_adapter *hdd_open_adapter(struct hdd_context *hdd_ctx, uint8_t sessio return NULL; } } + /* Check for max no of supported VDEVs before creating + * another one. + */ + intf_count = hdd_get_mode_specific_interface_count( + hdd_ctx, + session_type); + if (CFG_TGT_DEFAULT_MAX_STA_VDEVS && + (intf_count >= CFG_TGT_DEFAULT_MAX_STA_VDEVS)) { + hdd_err("Max limit reached sta vdev-current %d max %d", + intf_count, CFG_TGT_DEFAULT_MAX_STA_VDEVS); + return NULL; + } /* fall through */ case QDF_P2P_CLIENT_MODE: