qcacld-3.0: check for duplicate session before vdev create

Check for any duplicate peer with the same mac address before
the vdev is created.

Change-Id: Ie6d71b7b2892ab2ac6e8bfb37c99f20f0854c2f2
CRs-Fixed: 2555932
This commit is contained in:
Arun Kumar Khandavalli
2019-10-23 12:27:39 +05:30
committed by nshrivas
parent a8940a2ddf
commit add284b880
3 changed files with 61 additions and 22 deletions

View File

@@ -4497,6 +4497,13 @@ int hdd_vdev_create(struct hdd_adapter *adapter)
/* do vdev create via objmgr */ /* do vdev create via objmgr */
hdd_ctx = WLAN_HDD_GET_CTX(adapter); hdd_ctx = WLAN_HDD_GET_CTX(adapter);
status = sme_check_for_duplicate_session(hdd_ctx->mac_handle,
adapter->mac_addr.bytes);
if (QDF_IS_STATUS_ERROR(status)) {
hdd_err("Duplicate session is existing with same mac address");
errno = qdf_status_to_os_return(status);
return errno;
}
errno = hdd_objmgr_create_and_store_vdev(hdd_ctx->pdev, adapter); errno = hdd_objmgr_create_and_store_vdev(hdd_ctx->pdev, adapter);
if (errno) { if (errno) {
hdd_err("failed to create objmgr vdev: %d", errno); hdd_err("failed to create objmgr vdev: %d", errno);

View File

@@ -3941,4 +3941,16 @@ uint16_t sme_get_full_roam_scan_period_global(mac_handle_t mac_handle);
QDF_STATUS sme_get_full_roam_scan_period(mac_handle_t mac_handle, QDF_STATUS sme_get_full_roam_scan_period(mac_handle_t mac_handle,
uint8_t vdev_id, uint8_t vdev_id,
uint32_t *full_roam_scan_period); uint32_t *full_roam_scan_period);
/**
* sme_check_for_duplicate_session() - check for duplicate session
* @mac_handle: Opaque handle to the MAC context
* @peer_addr: Peer device mac address
*
* Check for duplicate mac address is available on other vdev.
*
* Return: QDF_STATUS
*/
QDF_STATUS sme_check_for_duplicate_session(mac_handle_t mac_handle,
uint8_t *peer_addr);
#endif /* #if !defined( __SME_API_H ) */ #endif /* #if !defined( __SME_API_H ) */

View File

@@ -4504,10 +4504,7 @@ QDF_STATUS sme_create_vdev(mac_handle_t mac_handle,
{ {
QDF_STATUS status = QDF_STATUS_E_INVAL; QDF_STATUS status = QDF_STATUS_E_INVAL;
struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle); struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
struct cdp_pdev *pdev; uint8_t vdev_id;
ol_txrx_peer_handle peer;
u8 peer_id, vdev_id;
void *soc = cds_get_context(QDF_MODULE_ID_SOC);
u8 *mac_addr; u8 *mac_addr;
vdev_id = wlan_vdev_get_id(params->vdev); vdev_id = wlan_vdev_get_id(params->vdev);
@@ -4515,28 +4512,13 @@ QDF_STATUS sme_create_vdev(mac_handle_t mac_handle,
sme_debug("vdev_id %d addr:%pM", vdev_id, mac_addr); sme_debug("vdev_id %d addr:%pM", vdev_id, mac_addr);
pdev = cds_get_context(QDF_MODULE_ID_TXRX);
if (!pdev) {
sme_err("Failed to get pdev handler");
return status;
}
status = sme_acquire_global_lock(&mac_ctx->sme); status = sme_acquire_global_lock(&mac_ctx->sme);
if (QDF_IS_STATUS_ERROR(status)) if (QDF_IS_STATUS_ERROR(status))
return status; return status;
peer = cdp_peer_find_by_addr(soc, pdev, status = csr_create_vdev(mac_ctx, params->vdev, params);
mac_addr, if (QDF_IS_STATUS_SUCCESS(status))
&peer_id); status = mlme_vdev_self_peer_create(params->vdev);
if (peer) {
sme_err("Peer=%d exist with same MAC", peer_id);
status = QDF_STATUS_E_INVAL;
} else {
status = csr_create_vdev(mac_ctx, params->vdev, params);
if (QDF_IS_STATUS_SUCCESS(status))
status = mlme_vdev_self_peer_create(params->vdev);
}
sme_release_global_lock(&mac_ctx->sme); sme_release_global_lock(&mac_ctx->sme);
MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_HDD_OPEN_SESSION, MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_HDD_OPEN_SESSION,
@@ -16188,3 +16170,41 @@ sme_get_full_roam_scan_period(mac_handle_t mac_handle, uint8_t vdev_id,
return status; return status;
} }
QDF_STATUS sme_check_for_duplicate_session(mac_handle_t mac_handle,
uint8_t *peer_addr)
{
QDF_STATUS status = QDF_STATUS_E_INVAL;
struct cdp_pdev *pdev;
ol_txrx_peer_handle peer;
uint8_t peer_id;
void *soc = cds_get_context(QDF_MODULE_ID_SOC);
struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
if (!soc) {
sme_err("Failed to get soc handle");
return QDF_STATUS_E_INVAL;
}
pdev = cds_get_context(QDF_MODULE_ID_TXRX);
if (!pdev) {
sme_err("Failed to get pdev handler");
return QDF_STATUS_E_INVAL;
}
if (QDF_STATUS_SUCCESS != sme_acquire_global_lock(&mac_ctx->sme))
return status;
peer = cdp_peer_find_by_addr(soc, pdev,
peer_addr,
&peer_id);
if (peer) {
sme_err("Peer=%d exist with same MAC", peer_id);
status = QDF_STATUS_E_EXISTS;
} else {
status = QDF_STATUS_SUCCESS;
}
sme_release_global_lock(&mac_ctx->sme);
return status;
}